package org.openstack.atlas.api.mgmt.resources.providers;
import org.openstack.atlas.api.faults.HttpResponseBuilder;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.Host;
import org.openstack.atlas.docs.loadbalancers.api.v1.faults.BadRequest;
import org.openstack.atlas.service.domain.events.repository.AlertRepository;
import org.openstack.atlas.service.domain.events.repository.LoadBalancerEventRepository;
import org.openstack.atlas.service.domain.repository.*;
import org.openstack.atlas.service.domain.services.*;
import org.openstack.atlas.service.domain.usage.repository.HostUsageRepository;
import org.openstack.atlas.api.integration.AsyncService;
import org.openstack.atlas.api.integration.ReverseProxyLoadBalancerService;
import org.openstack.atlas.api.mgmt.helpers.LDAPTools.MossoAuthConfig;
import org.openstack.atlas.api.mgmt.integration.ManagementAsyncService;
import org.openstack.atlas.api.resources.providers.RequestStateContainer;
import org.openstack.atlas.util.ip.IPv6;
import org.dozer.DozerBeanMapper;
import org.openstack.atlas.cfg.Configuration;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.*;
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class ManagementDependencyProvider {
private boolean mockitoAuth = false;
protected final static String VFAIL = "Validation Failure";
private MossoAuthConfig mossoAuthConfig;
private RequestStateContainer requestStateContainer;
protected ManagementAsyncService managementAsyncService;
protected AsyncService esbService;
protected DozerBeanMapper dozerMapper;
protected ClusterRepository clusterRepository;
protected HostRepository hostRepository;
protected LoadBalancerRepository loadBalancerRepository;
protected AlertRepository alertRepository;
protected VirtualIpRepository vipRepository;
protected GroupRepository groupRepository;
protected LoadBalancerEventRepository eventRepository;
protected AccountLimitRepository accountLimitRepository;
protected AccountUsageRepository accountUsageRepository;
protected UsageRepository usageRepository;
protected HostUsageRepository hostUsageRepository;
protected BlacklistRepository blacklistRepository;
protected AllowedDomainsRepository allowedDomainsRepository;
protected LoadBalancerStatusHistoryRepository loadBalancerStatusHistoryRepository;
protected TicketService ticketService;
protected AccountLimitService accountLimitService;
protected LoadBalancerService loadBalancerService;
protected VirtualIpService virtualIpService;
protected HostService hostService;
protected GroupService groupService;
protected AlertService alertService;
protected RateLimitingService rateLimitingService;
protected CallbackService callbackService;
protected NotificationService notificationService;
protected BlackListService blackListService;
protected ReverseProxyLoadBalancerService reverseProxyLoadBalancerService;
protected SuspensionService suspensionService;
protected ClusterService clusterService;
protected JobStateService jobStateService;
protected AllowedDomainsService allowedDomainsService;
protected LoadBalancerStatusHistoryService loadBalancerStatusHistoryService;
protected Configuration configuration;
public static String getStackTraceMessage(Exception e) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("Exception: %s:%s\n", e.getMessage(), e.getClass().getName()));
for (StackTraceElement se : e.getStackTrace()) {
sb.append(String.format("%s\n", se.toString()));
}
return sb.toString();
}
public void setAlertService(AlertService alertService) {
this.alertService = alertService;
}
public void setLoadBalancerService(LoadBalancerService loadBalancerService) {
this.loadBalancerService = loadBalancerService;
}
public void setVirtualIpService(VirtualIpService virtualIpService) {
this.virtualIpService = virtualIpService;
}
public ManagementAsyncService getManagementAsyncService() {
return managementAsyncService;
}
public void setEsbService(AsyncService esbService) {
this.esbService = esbService;
}
public AsyncService getEsbService() {
return esbService;
}
public void setAccountLimitService(AccountLimitService loadBalancerLimitGroupService) {
this.accountLimitService = loadBalancerLimitGroupService;
}
public BlackListService getBlackListService() {
return blackListService;
}
public void setBlackListService(BlackListService blackListService) {
this.blackListService = blackListService;
}
public void setGroupService(GroupService groupService) {
this.groupService = groupService;
}
public void setHostService(HostService hostService) {
this.hostService = hostService;
}
public void setRateLimitingService(RateLimitingService rateLimitingService) {
this.rateLimitingService = rateLimitingService;
}
public void setClusterService(ClusterService clusterService) {
this.clusterService = clusterService;
}
public void setJobStateService(JobStateService jobStateService) {
this.jobStateService = jobStateService;
}
public void setSuspensionService(SuspensionService suspensionService) {
this.suspensionService = suspensionService;
}
public void setTicketService(TicketService ticketService) {
this.ticketService = ticketService;
}
public void setReverseProxyLoadBalancerService(ReverseProxyLoadBalancerService reverseProxyLoadBalancerService) {
this.reverseProxyLoadBalancerService = reverseProxyLoadBalancerService;
}
public void setNotificationService(NotificationService notificationService) {
this.notificationService = notificationService;
}
public void setManagementAsyncService(ManagementAsyncService managementAsyncService) {
this.managementAsyncService = managementAsyncService;
}
public void setCallbackService(CallbackService callbackService) {
this.callbackService = callbackService;
}
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
public Configuration getConfiguration() {
return configuration;
}
public ClusterRepository getClusterRepository() {
return clusterRepository;
}
public void setClusterRepository(ClusterRepository clusterRepository) {
this.clusterRepository = clusterRepository;
}
public HostRepository getHostRepository() {
return hostRepository;
}
public void setHostRepository(HostRepository hostRepository) {
this.hostRepository = hostRepository;
}
public LoadBalancerRepository getLoadBalancerRepository() {
return loadBalancerRepository;
}
public void setLoadBalancerRepository(LoadBalancerRepository loadBalancerRepository) {
this.loadBalancerRepository = loadBalancerRepository;
}
public AlertRepository getAlertRepository() {
return alertRepository;
}
public void setAlertRepository(AlertRepository alertRepository) {
this.alertRepository = alertRepository;
}
public DozerBeanMapper getDozerMapper() {
return dozerMapper;
}
public void setDozerMapper(DozerBeanMapper dozerMapper) {
this.dozerMapper = dozerMapper;
}
public GroupRepository getGroupRepository() {
return groupRepository;
}
public void setGroupRepository(GroupRepository groupRepository) {
this.groupRepository = groupRepository;
}
public LoadBalancerEventRepository getEventRepository() {
return eventRepository;
}
public void setEventRepository(LoadBalancerEventRepository eventRepository) {
this.eventRepository = eventRepository;
}
public AccountLimitRepository getAccountLimitRepository() {
return accountLimitRepository;
}
public void setAccountLimitRepository(AccountLimitRepository accountLimitRepository) {
this.accountLimitRepository = accountLimitRepository;
}
public AccountUsageRepository getAccountUsageRepository() {
return accountUsageRepository;
}
public void setAccountUsageRepository(AccountUsageRepository accountUsageRepository) {
this.accountUsageRepository = accountUsageRepository;
}
public UsageRepository getUsageRepository() {
return usageRepository;
}
public void setUsageRepository(UsageRepository usageRepository) {
this.usageRepository = usageRepository;
}
public HostUsageRepository getHostUsageRepository() {
return hostUsageRepository;
}
public void setHostUsageRepository(HostUsageRepository hostUsageRepository) {
this.hostUsageRepository = hostUsageRepository;
}
public VirtualIpRepository getVipRepository() {
return vipRepository;
}
public void setVipRepository(VirtualIpRepository vipRepository) {
this.vipRepository = vipRepository;
}
public RequestStateContainer getRequestStateContainer() {
return requestStateContainer;
}
public void setRequestStateContainer(RequestStateContainer requestStateContainer) {
this.requestStateContainer = requestStateContainer;
}
public BlacklistRepository getBlacklistRepository() {
return blacklistRepository;
}
public void setBlacklistRepository(BlacklistRepository blacklistRepository) {
this.blacklistRepository = blacklistRepository;
}
public void setAllowedDomainsService(AllowedDomainsService allowedDomainsService) {
this.allowedDomainsService = allowedDomainsService;
}
public void setAllowedDomainsRepository(AllowedDomainsRepository allowedDomainsRepository) {
this.allowedDomainsRepository = allowedDomainsRepository;
}
public void setLoadBalancerStatusHistoryRepository(LoadBalancerStatusHistoryRepository loadBalancerStatusHistoryRepository) {
this.loadBalancerStatusHistoryRepository = loadBalancerStatusHistoryRepository;
}
public void setLoadBalancerStatusHistoryService(LoadBalancerStatusHistoryService loadBalancerStatusHistoryService) {
this.loadBalancerStatusHistoryService = loadBalancerStatusHistoryService;
}
public Set<String> getLDAPGroups() {
Set<String> groupSet = new HashSet<String>();
List<String> groupList;
try {
groupList = this.requestStateContainer.getHttpHeaders().getRequestHeader("LDAPGroups");
if (groupList == null) {
return groupSet;
} else {
groupSet = new HashSet<String>(groupList);
return groupSet;
}
} catch (NullPointerException ex) {
return groupSet;
}
}
public String getLDAPUser() {
String out = null;
try {
out = this.requestStateContainer.getHttpHeaders().getRequestHeaders().getFirst("LDAPUser");
return out;
} catch (NullPointerException ex) {
return out;
}
}
public Set<String> userRoles() {
Set<String> out = new HashSet<String>();
Map<String, HashSet<String>> roleMap = getMossoAuthConfig().getRoles();
Set<String> roleNames = roleMap.keySet();
for (String roleName : roleNames) {
Set<String> groupsInRole = roleMap.get(roleName);
Set<String> ldapGroups = getLDAPGroups();
if (intersection(ldapGroups, groupsInRole).size() > 0) {
out.add(roleName);
}
}
return out;
}
private boolean isBypassAuth() {
if (isMockitoAuth()) {
return true;
}
try {
List<String> bypassauth = getRequestStateContainer().getHttpHeaders().getRequestHeader("BYPASS-AUTH");
if (bypassauth != null && !bypassauth.isEmpty() && bypassauth.get(0).toLowerCase().equals("true")) {
return true;
}
} catch (NullPointerException ex) {
throw new IllegalArgumentException("No auth data founf\n", ex);
}
return false;
}
public boolean isUserInRole(String roleStr) {
int i;
boolean out = false;
if (isBypassAuth()) {
return true; // Bypass auth was set to true so consider this request valid.
}
String[] roleSplit = roleStr.split(",");
for (i = 0; i < roleSplit.length; i++) {
String roleName = roleSplit[i];
if (!getMossoAuthConfig().getRoles().containsKey(roleName)) {
String fileName = getMossoAuthConfig().getFileName();
String format = "Role \"%s\" was not found in %s\n";
String msg = String.format(format, roleName, fileName);
throw new IllegalArgumentException(msg);
}
Set<String> roleSet = getMossoAuthConfig().getRoles().get(roleName);
if (intersection(getLDAPGroups(), roleSet).size() > 0) {
out = true;
return out;
}
}
return out;
}
public Set<String> intersection(Set<String> a, Set<String> b) {
Set<String> out = new HashSet<String>(a);
a.retainAll(b);
return a;
}
public MossoAuthConfig getMossoAuthConfig() {
return mossoAuthConfig;
}
public void setMossoAuthConfig(MossoAuthConfig mossoAuthConfig) {
this.mossoAuthConfig = mossoAuthConfig;
}
public void nop() {
}
public boolean isMockitoAuth() {
return mockitoAuth;
}
// setMokitoAuth(true) when your running mock tests on this class
// otherwise your tests will fail while trying to fetch auth data from non existent headers
public void setMockitoAuth(boolean mockitoAuth) {
this.mockitoAuth = mockitoAuth;
}
public String expandipv6(String ip) {
String expanded;
if (ip == null) {
return null;
}
try {
expanded = (new IPv6(ip)).expand();
} catch (org.openstack.atlas.util.ip.exception.IPStringConversionException ex) {
return null;
}
return expanded;
}
public Response getValidationFaultResponse(String errorStr){
List<String> errorStrs = new ArrayList<String>();
errorStrs.add(errorStr);
return getValidationFaultResponse(errorStrs);
}
public Response getValidationFaultResponse(List<String> errorStrs) {
BadRequest badreq;
int status = 400;
badreq = HttpResponseBuilder.buildBadRequestResponse(VFAIL, errorStrs);
Response resp = Response.status(status).entity(badreq).build();
return resp;
}
// Got tired of always import StringUtils.getExtendedStackTrace so I'm aliasing it
public String getExtendedStackTrace(Throwable ti){
String out;
out = org.openstack.atlas.api.filters.helpers.StringUtilities.getExtendedStackTrace(ti);
return out;
}
public void expandIpv6InHost(Host host) {
String ipv6Public = expandipv6(host.getIpv6Public());
String ip8Servicenet = expandipv6(host.getIpv6Servicenet());
host.setIpv6Public(ipv6Public);
host.setIpv6Servicenet(ip8Servicenet);
}
}