return Collections.emptyList();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return Optional.empty();
+ }
+
@Override
public boolean isLoggedIn() {
return false;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
import org.sonar.core.permission.ProjectPermissions;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.permission.OrganizationPermission;
+import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.UnauthorizedException;
private static final String INSUFFICIENT_PRIVILEGES_MESSAGE = "Insufficient privileges";
private static final ForbiddenException INSUFFICIENT_PRIVILEGES_EXCEPTION = new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
private static final String AUTHENTICATION_IS_REQUIRED_MESSAGE = "Authentication is required";
+
+ protected static Identity computeIdentity(UserDto userDto) {
+ switch (userDto.getExternalIdentityProvider()) {
+ case "github":
+ return new Identity(IdentityProvider.GITHUB, externalIdentityOf(userDto));
+ case "bitbucket":
+ return new Identity(IdentityProvider.BITBUCKET, externalIdentityOf(userDto));
+ case "sonarqube":
+ return new Identity(IdentityProvider.SONARQUBE, null);
+ default:
+ return new Identity(IdentityProvider.OTHER, externalIdentityOf(userDto));
+ }
+ }
+
+ @CheckForNull
+ private static ExternalIdentity externalIdentityOf(UserDto userDto) {
+ String externalId = userDto.getExternalId();
+ String externalLogin = userDto.getExternalLogin();
+ if (externalId == null && externalLogin == null) {
+ return null;
+ }
+ return new ExternalIdentity(externalId == null ? externalLogin : externalId, externalLogin);
+ }
+
+ protected static final class Identity {
+ private final IdentityProvider identityProvider;
+ private final ExternalIdentity externalIdentity;
+
+ private Identity(IdentityProvider identityProvider, @Nullable ExternalIdentity externalIdentity) {
+ this.identityProvider = identityProvider;
+ this.externalIdentity = externalIdentity;
+ }
+
+ public IdentityProvider getIdentityProvider() {
+ return identityProvider;
+ }
+
+ @CheckForNull
+ public ExternalIdentity getExternalIdentity() {
+ return externalIdentity;
+ }
+ }
+
@Override
public final boolean hasPermission(OrganizationPermission permission, OrganizationDto organization) {
return hasPermission(permission, organization.getUuid());
return true;
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return Optional.empty();
+ }
+
@Override
protected boolean hasPermissionImpl(OrganizationPermission permission, String organizationUuid) {
return true;
import org.sonar.server.organization.OrganizationFlags;
import static java.util.Objects.requireNonNull;
+import static java.util.Optional.of;
+import static java.util.Optional.ofNullable;
import static org.apache.commons.lang.StringUtils.defaultIfEmpty;
/**
return userDto != null && userDto.isRoot();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return ofNullable(userDto).map(d -> computeIdentity(d).getIdentityProvider());
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return ofNullable(userDto).map(d -> computeIdentity(d).getExternalIdentity());
+ }
+
@Override
protected boolean hasPermissionImpl(OrganizationPermission permission, String organizationUuid) {
if (permissionsByOrganizationUuid == null) {
protected Optional<String> componentUuidToProjectUuid(String componentUuid) {
String projectUuid = projectUuidByComponentUuid.get(componentUuid);
if (projectUuid != null) {
- return Optional.of(projectUuid);
+ return of(projectUuid);
}
try (DbSession dbSession = dbClient.openSession(false)) {
com.google.common.base.Optional<ComponentDto> component = dbClient.componentDao().selectByUuid(dbSession, componentUuid);
// checked on the project (represented by its main branch)
projectUuid = defaultIfEmpty(component.get().getMainBranchProjectUuid(), component.get().projectUuid());
projectUuidByComponentUuid.put(componentUuid, projectUuid);
- return Optional.of(projectUuid);
+ return of(projectUuid);
}
}
import java.util.Collection;
import java.util.List;
+import java.util.Optional;
import javax.annotation.CheckForNull;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
return get().getGroups();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return get().getIdentityProvider();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return get().getExternalIdentity();
+ }
+
@Override
public boolean isLoggedIn() {
return get().isLoggedIn();
import java.util.Collection;
import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
import javax.annotation.CheckForNull;
+import javax.annotation.concurrent.Immutable;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.permission.OrganizationPermission;
import org.sonar.db.user.GroupDto;
+import static java.util.Objects.requireNonNull;
+
public interface UserSession {
/**
*/
Collection<GroupDto> getGroups();
+ /**
+ * This enum supports by name only the few providers for which specific code exists.
+ */
+ enum IdentityProvider {
+ SONARQUBE, GITHUB, BITBUCKET, OTHER
+ }
+
+ /**
+ * @return empty if user is anonymous
+ */
+ Optional<IdentityProvider> getIdentityProvider();
+
+ @Immutable
+ final class ExternalIdentity {
+ private final String id;
+ private final String login;
+
+ public ExternalIdentity(String id, String login) {
+ this.id = requireNonNull(id, "id can't be null");
+ this.login = requireNonNull(login, "login can't be null");
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getLogin() {
+ return login;
+ }
+
+ @Override
+ public String toString() {
+ return "ExternalIdentity{" +
+ "id='" + id + '\'' +
+ ", login='" + login + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ExternalIdentity that = (ExternalIdentity) o;
+ return Objects.equals(id, that.id) &&
+ Objects.equals(login, that.login);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, login);
+ }
+ }
+
+ /**
+ * @return empty if {@link #getIdentityProvider()} returns empty or {@link IdentityProvider#SONARQUBE}
+ */
+ Optional<ExternalIdentity> getExternalIdentity();
+
/**
* Whether the user is logged-in or anonymous.
*/
import java.util.Collection;
import java.util.Collections;
+import java.util.Optional;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.user.GroupDto;
return Collections.emptyList();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return Optional.empty();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return Optional.empty();
+ }
+
@Override
public boolean hasMembershipImpl(OrganizationDto organizationDto) {
return false;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import java.util.Objects;
+import java.util.Optional;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.user.AbstractUserSession;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Arrays.asList;
+import static java.util.Objects.requireNonNull;
+import static org.sonar.server.user.UserSession.IdentityProvider.SONARQUBE;
public class MockUserSession extends AbstractMockUserSession<MockUserSession> {
private final String login;
private Integer userId;
private String name;
private List<GroupDto> groups = new ArrayList<>();
+ private IdentityProvider identityProvider;
+ private ExternalIdentity externalIdentity;
public MockUserSession(String login) {
super(MockUserSession.class);
setUuid(login + "uuid");
setUserId(login.hashCode());
setName(login + " name");
+ setInternalIdentity();
}
public MockUserSession(UserDto userDto) {
setUuid(userDto.getUuid());
setUserId(userDto.getId());
setName(userDto.getName());
+ AbstractUserSession.Identity identity = computeIdentity(userDto);
+ this.identityProvider = identity.getIdentityProvider();
+ this.externalIdentity = identity.getExternalIdentity();
}
@Override
}
public MockUserSession setUuid(String uuid) {
- this.uuid = Objects.requireNonNull(uuid);
+ this.uuid = requireNonNull(uuid);
return this;
}
}
public MockUserSession setName(String s) {
- this.name = Objects.requireNonNull(s);
+ this.name = requireNonNull(s);
return this;
}
return this;
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return Optional.ofNullable(identityProvider);
+ }
+
+ public void setExternalIdentity(IdentityProvider identityProvider, ExternalIdentity externalIdentity) {
+ checkArgument(identityProvider != SONARQUBE);
+ this.identityProvider = identityProvider;
+ this.externalIdentity = requireNonNull(externalIdentity);
+ }
+
+ public void setInternalIdentity() {
+ this.identityProvider = SONARQUBE;
+ this.externalIdentity = null;
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return Optional.ofNullable(externalIdentity);
+ }
}
import com.google.common.base.Preconditions;
import java.util.Collection;
import java.util.List;
+import java.util.Optional;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.junit.rules.TestRule;
return this;
}
+ public UserSessionRule setExternalIdentity(IdentityProvider identityProvider, ExternalIdentity externalIdentity) {
+ ensureMockUserSession().setExternalIdentity(identityProvider, externalIdentity);
+ return this;
+ }
+
+ public UserSessionRule setInternalIdentity() {
+ ensureMockUserSession().setInternalIdentity();
+ return this;
+ }
+
@Override
public Statement apply(Statement statement, Description description) {
return this.statement(statement);
return currentUserSession.getGroups();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ return currentUserSession.getIdentityProvider();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ return currentUserSession.getExternalIdentity();
+ }
+
@Override
public boolean isLoggedIn() {
return currentUserSession.isLoggedIn();
throw notImplemented();
}
+ @Override
+ public Optional<IdentityProvider> getIdentityProvider() {
+ throw notImplemented();
+ }
+
+ @Override
+ public Optional<ExternalIdentity> getExternalIdentity() {
+ throw notImplemented();
+ }
+
@Override
public boolean isLoggedIn() {
return user != null;