package edu.sjtu.infosec.ismp.manager.RAM.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.config.SetFactoryBean;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.RAM.dao.LeakScanDao;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoLeak;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoProj;
import edu.sjtu.infosec.ismp.manager.comm.model.page.Page;
/**
* 数据层 漏洞扫描Dao实现类.
*
**/
public class LeakScanDaoImpl extends HibernateDaoSupport implements LeakScanDao {
/**
* 批量保存/更新扫描漏洞
*
* @param leaks
* 漏洞列表
**/
@SuppressWarnings("unchecked")
public void batchSaveOrUpdate(final List<AsseInfoLeak> leaks) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,SQLException {
for(int i=0;i<leaks.size();i++) {
AsseInfoLeak asseInfoLeak = (AsseInfoLeak) leaks.get(i);
session.saveOrUpdate(asseInfoLeak);
System.out.println("batch saved asseInfoLeak:"+asseInfoLeak.toString());
if((i+1)%20 == 0){
session.flush();
session.clear();
}
}
return null;
}
});
}
/**
* 查询漏洞
*
* @param id
* 漏洞id
* @return 漏洞对象
**/
public AsseInfoLeak find(Integer id) {
AsseInfoLeak infoLeak=null;
List list = this.getHibernateTemplate().find("from AsseInfoLeak where id = "+id);
if(list!=null&&list.size()>0){
infoLeak = (AsseInfoLeak) list.get(0);
}
return infoLeak;
}
/**
* 查询漏洞数量
* @param asseInfoProj
* 测评项目
* @return 漏洞数量
**/
public int getCount(AsseInfoProj asseInfoProj, String ip) {
Criteria criteria = getSession().createCriteria(AsseInfoLeak.class)
.addOrder(Order.asc("id"));
if(asseInfoProj!=null ) {
criteria.add(Expression.eq("asseInfoProj", asseInfoProj));
}
if(ip!=null && !"".equals(ip)) {
criteria.add(Expression.eq("ip", ip));
}
return criteria.list().size();
}
/**
* 删除漏洞
*
* @param leak
* 漏洞
**/
public void remove(AsseInfoLeak leak) {
getHibernateTemplate().delete(leak);
}
/**
* 批量删除漏洞
*
* @param leakList
* 漏洞列表
**/
public void remove(List<AsseInfoLeak> leakList) {
getHibernateTemplate().deleteAll(leakList);
}
/**
* 保存/更新扫描漏洞
*
* @param leak
* 漏洞
**/
public void saveOrUpdate(AsseInfoLeak leak) {
getHibernateTemplate().saveOrUpdate(leak);
}
/**
* 查询漏洞
*
* @param cveId
* cveId
* @param asseInfoProj
* 测评项目
* @return 漏洞对象
**/
public AsseInfoLeak findByCveId(String cveId, AsseInfoProj asseInfoProj) {
AsseInfoLeak asseInfoLeak = null;
List leakList = getSession().createCriteria(AsseInfoLeak.class)
.add(Expression.eq("cveId", cveId))
.add(Expression.eq("asseInfoProj", asseInfoProj))
.list();
if(leakList!=null && leakList.size()>0) {
asseInfoLeak = (AsseInfoLeak) leakList.get(0);
}
return asseInfoLeak;
}
/**
* 查询漏洞记录
* @param asseInfoProj
* 测评项目
* @return 分页记录列表
**/
public List<AsseInfoLeak> listAsseInfoLeak(AsseInfoProj asseInfoProj) {
Criteria criteria = getSession().createCriteria(AsseInfoLeak.class)
.addOrder(Order.asc("id"));
if(asseInfoProj!=null ) {
criteria.add(Expression.eq("asseInfoProj", asseInfoProj));
}
return criteria.list();
}
/**
* 查询漏洞
*
* @param pluginId
* pluginId
* @param asseInfoProj
* 测评项目
* @return 漏洞对象
**/
public List findByPluginId(String pluginId, AsseInfoProj asseInfoProj) {
List leakList = getSession().createCriteria(AsseInfoLeak.class)
.add(Expression.eq("pluginId", pluginId))
.add(Expression.eq("asseInfoProj", asseInfoProj))
.list();
return leakList;
}
/**
* 查询漏洞
*
* @param vulId
* vulId
* @param asseInfoProj
* 测评项目
* @return 漏洞对象
**/
public List findByVulId(String vulId, AsseInfoProj asseInfoProj) {
List leakList = getSession().createCriteria(AsseInfoLeak.class)
.add(Expression.eq("knowId", vulId))
.add(Expression.eq("asseInfoProj", asseInfoProj))
.list();
return leakList;
}
/**
* 查询IP地址列表
* @param asseInfoProj
* 测评项目
* @return IP地址列表
**/
public List<String> listIP(AsseInfoProj asseInfoProj) {
List ipList = getHibernateTemplate().find("select DISTINCT ip from AsseInfoLeak where asseInfoProj = ?",asseInfoProj);
return ipList;
}
public List<String> listCVEId(AsseInfoProj asseInfoProj) {
List CVEIdList = getHibernateTemplate().find("select DISTINCT cveId from AsseInfoLeak where asseInfoProj = ? and cveId is not null",asseInfoProj);
return CVEIdList;
}
/**
* 查询漏洞分页记录
* @param page
* 分页对象
* @param asseInfoProj
* 测评项目
* @return 分页记录列表
**/
public List<AsseInfoLeak> findAll(int startResult, int maxResult,
AsseInfoProj asseInfoProj, String ip) {
Criteria criteria = getSession().createCriteria(AsseInfoLeak.class)
.addOrder(Order.asc("id"))
.setFirstResult(startResult)
.setMaxResults(maxResult);
if(asseInfoProj!=null ) {
criteria.add(Restrictions.eq("asseInfoProj", asseInfoProj));
}
if(ip!=null && !"".equals(ip)) {
criteria.add(Restrictions.eq("ip", ip));
}
return criteria.list();
}
}