package org.zstack.identity; import org.springframework.beans.factory.annotation.Autowired; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.GlobalApiMessageInterceptor; import org.zstack.header.identity.Quota; import org.zstack.header.identity.Quota.QuotaPair; import org.zstack.header.message.APIMessage; import java.util.List; import java.util.Map; /** * Created by frank on 7/30/2015. */ public class QuotaChecker implements GlobalApiMessageInterceptor { @Autowired private AccountManager acntMgr; @Autowired private DatabaseFacade dbf; @Override public List<Class> getMessageClassToIntercept() { return null; } @Override public InterceptorPosition getPosition() { return InterceptorPosition.END; } @Override public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { // login, logout if (msg.getSession() == null) { return msg; } // skip admin. if needed, another quota check will be issued in AccountManagerImpl if (new QuotaUtil().isAdminAccount(msg.getSession().getAccountUuid())) { return msg; } List<Quota> quotas = acntMgr.getMessageQuotaMap().get(msg.getClass()); if (quotas == null || quotas.size() == 0) { return msg; } for (Quota q : quotas) { check(msg, q); } return msg; } private void check(APIMessage msg, Quota quota) { Map<String, QuotaPair> pairs = new QuotaUtil().makeQuotaPairs(msg.getSession().getAccountUuid()); quota.getOperator().checkQuota(msg, pairs); if (quota.getQuotaValidators() != null) { for (Quota.QuotaValidator q : quota.getQuotaValidators()) { q.checkQuota(msg, pairs); } } } }