package edu.harvard.iq.dataverse.authorization.groups.impl.shib;
import edu.harvard.iq.dataverse.DvObject;
import edu.harvard.iq.dataverse.authorization.RoleAssignee;
import edu.harvard.iq.dataverse.authorization.groups.GroupProvider;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.authorization.users.User;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;
public class ShibGroupProvider implements GroupProvider<ShibGroup> {
private static final Logger logger = Logger.getLogger(ShibGroupProvider.class.getCanonicalName());
private final ShibGroupServiceBean shibGroupService;
public ShibGroupProvider(ShibGroupServiceBean shibGroupService) {
this.shibGroupService = shibGroupService;
}
public static String getShibProviderAlias() {
return "shib";
}
@Override
public String getGroupProviderAlias() {
return getShibProviderAlias();
}
@Override
public String getGroupProviderInfo() {
return "Groups users based on Shibboleth attributes received from their institution's authentication system.";
}
@Override
public Set<ShibGroup> groupsFor( DataverseRequest req, DvObject dvo ) {
return groupsFor( req.getUser(), dvo );
}
@Override
public Set<ShibGroup> groupsFor(RoleAssignee ra, DvObject o) {
if ( ra instanceof User ) {
User user = (User) ra;
Set<ShibGroup> shibGroups = new HashSet<>();
if ( user instanceof AuthenticatedUser ) {
AuthenticatedUser authenticatedUser = (AuthenticatedUser) user;
Set<ShibGroup> groupsFor = shibGroupService.findFor(authenticatedUser);
for (ShibGroup shibGroup : groupsFor) {
shibGroup.setShibGroupProvider(this);
}
return groupsFor;
}
return shibGroups;
} else {
return Collections.emptySet();
}
}
@Override
public Set<ShibGroup> findGlobalGroups() {
Set<ShibGroup> allShibGroups = new HashSet<>();
for (ShibGroup shibGroup : shibGroupService.findAll()) {
allShibGroups.add(shibGroup);
}
return allShibGroups;
}
@Override
public ShibGroup get(String groupAlias) {
long shibGroupPrimaryKey = 0;
try {
shibGroupPrimaryKey = Long.parseLong(groupAlias);
} catch (NumberFormatException ex) {
logger.info("Could not convert \"" + groupAlias + "\" into a long.");
return null;
}
ShibGroup shibGroup = shibGroupService.findById(shibGroupPrimaryKey);
return shibGroup;
}
public ShibGroup persist(ShibGroup shibGroup) {
ShibGroup persistedShibGroupOrNull = shibGroupService.save(shibGroup.getName(), shibGroup.getAttribute(), shibGroup.getPattern());
return persistedShibGroupOrNull;
}
public boolean delete(ShibGroup doomed) throws Exception {
boolean response = shibGroupService.delete(doomed);
return response;
}
}