package org.openstack.atlas.service.domain.services.impl; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openstack.atlas.service.domain.entities.BlacklistItem; import org.openstack.atlas.service.domain.entities.BlacklistType; import org.openstack.atlas.service.domain.entities.IpVersion; import org.openstack.atlas.service.domain.entities.Node; import org.openstack.atlas.service.domain.exceptions.BadRequestException; import org.openstack.atlas.service.domain.exceptions.EntityNotFoundException; import org.openstack.atlas.service.domain.services.BlackListService; import org.openstack.atlas.service.domain.util.StringUtilities; import org.openstack.atlas.util.ip.IPv6Cidr; import org.openstack.atlas.util.ip.exception.IPStringConversionException; import org.openstack.atlas.util.ip.exception.IpTypeMissMatchException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @Service public class BlackListServiceImpl extends BaseService implements BlackListService { private final Log LOG = LogFactory.getLog(BlackListServiceImpl.class); @Override @Transactional public void deleteBlackList(BlacklistItem msgBlacklist) throws Exception { LOG.debug("Entering " + getClass()); BlacklistItem dbBlacklist = null; LOG.debug(String.format("del black list[%d]\n", msgBlacklist.getId())); try { dbBlacklist = blacklistRepository.getById(msgBlacklist.getId()); } catch (EntityNotFoundException enfe) { throw new EntityNotFoundException(String.format("BlackListItem with id #%d not found ", msgBlacklist.getId())); } LOG.debug("Deleting the blacklistitem"); blacklistRepository.delete(dbBlacklist); } @Override @Transactional public Node getBlackListedItemNode(Set<Node> nodes) throws IPStringConversionException, IpTypeMissMatchException { Node out; out = blackListedItemNode(nodes); return out; } @Override @Transactional public List<BlacklistItem> createBlacklist(List<BlacklistItem> list) throws BadRequestException { Map<String, List<BlacklistItem>> map = blacklistRepository.getBlacklistItemsCidrHashMap(list); List<BlacklistItem> goodList = new ArrayList<BlacklistItem>(); List<BlacklistItem> badList = new ArrayList<BlacklistItem>(); List<BlacklistItem> blist; String cidrBlock; for (BlacklistItem item : list) { if (item.getIpVersion().equals(IpVersion.IPV6)) { try { cidrBlock = new IPv6Cidr().getExpandedIPv6Cidr(item.getCidrBlock()); } catch (IPStringConversionException e) { throw new BadRequestException(item.getCidrBlock() + " is not valid."); } } else { cidrBlock = item.getCidrBlock(); } if (map.containsKey(cidrBlock)) { blist = map.get(cidrBlock); } else { blist = new ArrayList<BlacklistItem>(); } if (blist.size() == 1) { for (BlacklistItem bli : blist) { if (item.getBlacklistType() == null) { if (bli.getBlacklistType() == BlacklistType.NODE) { item.setBlacklistType(BlacklistType.ACCESSLIST); } else { item.setBlacklistType(BlacklistType.NODE); } goodList.add(item); } else if (item.getBlacklistType().equals(bli.getBlacklistType())) { badList.add(item); } else { goodList.add(item); } } } else if (blist.size() == 2) { badList.add(item); } else { if (item.getBlacklistType() == null) { goodList.add(setBlacklistItemFields(item, BlacklistType.ACCESSLIST)); goodList.add(setBlacklistItemFields(item, BlacklistType.NODE)); } else { goodList.add(item); } } } if (badList.size() == 0) { blacklistRepository.saveBlacklist(goodList); } else { String retString = "The following CIDR blocks are currently black listed: "; String retList[] = new String[badList.size()]; int index = 0; for (BlacklistItem bli : badList) { retList[index++] = bli.getCidrBlock(); } retString += StringUtilities.buildDelemtedListFromStringArray(retList, ", "); throw new BadRequestException(retString); } return new ArrayList<BlacklistItem>(); } private BlacklistItem setBlacklistItemFields(BlacklistItem item, BlacklistType type) { BlacklistItem blItem = new BlacklistItem(); blItem.setBlacklistType(type); blItem.setCidrBlock(item.getCidrBlock()); blItem.setIpVersion(item.getIpVersion()); blItem.setUserName(item.getUserName()); return blItem; } }