public RemoteCollection(DavContext ctxt, Mountpoint mp) throws DavException, ServiceException {
   super(ctxt, mp);
   mRemoteOwnerId = mp.getOwnerId();
   mRemoteId = mp.getRemoteId();
   addResourceType(DavElements.E_MOUNTPOINT);
   getMountpointTarget(ctxt);
   mMailboxId = 0;
   Account target = Provisioning.getInstance().get(Key.AccountBy.id, mRemoteOwnerId);
   if (target != null && Provisioning.onLocalServer(target))
     mMailboxId = MailboxManager.getInstance().getMailboxByAccount(target).getId();
 }
  @Override
  protected Element proxyIfNecessary(Element request, Map<String, Object> context)
      throws ServiceException {
    // if we've explicitly been told to execute here, don't proxy
    ZimbraSoapContext zsc = getZimbraSoapContext(context);
    if (zsc.getProxyTarget() != null) return null;

    // check whether we need to proxy to the home server of a target account
    Provisioning prov = Provisioning.getInstance();
    String[] xpath = getProxiedAccountPath();
    String acctId = (xpath != null ? getXPath(request, xpath) : null);
    if (acctId != null) {
      Account acct = getAccount(prov, AccountBy.id, acctId, zsc.getAuthToken());
      if (acct != null && !Provisioning.onLocalServer(acct))
        return proxyRequest(request, context, acctId);
    }

    return null;
  }
  @Override
  public LmtpReply getAddressStatus(LmtpAddress address) {
    String addr = address.getEmailAddress();

    try {
      Provisioning prov = Provisioning.getInstance();
      Account acct = prov.get(AccountBy.name, addr);
      if (acct == null) {
        ZimbraLog.lmtp.info("rejecting address " + addr + ": no account");
        return LmtpReply.NO_SUCH_USER;
      }

      String acctStatus = acct.getAccountStatus(prov);
      if (acctStatus == null) {
        ZimbraLog.lmtp.warn("rejecting address " + addr + ": no account status");
        return LmtpReply.NO_SUCH_USER;
      }

      if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_MAINTENANCE)) {
        ZimbraLog.lmtp.info("try again for address " + addr + ": account status maintenance");
        return LmtpReply.MAILBOX_DISABLED;
      }

      if (Provisioning.onLocalServer(acct)) {
        address.setOnLocalServer(true);
      } else if (Provisioning.getInstance().getServer(acct) != null) {
        address.setOnLocalServer(false);
        address.setRemoteServer(acct.getMailHost());
      } else {
        ZimbraLog.lmtp.warn("try again for address " + addr + ": mailbox is not on this server");
        return LmtpReply.MAILBOX_NOT_ON_THIS_SERVER;
      }

      if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_PENDING)) {
        ZimbraLog.lmtp.info("rejecting address " + addr + ": account status pending");
        return LmtpReply.NO_SUCH_USER;
      }

      if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_CLOSED)) {
        ZimbraLog.lmtp.info("rejecting address " + addr + ": account status closed");
        return LmtpReply.NO_SUCH_USER;
      }

      if (acctStatus.equals(Provisioning.ACCOUNT_STATUS_ACTIVE)
          || acctStatus.equals(Provisioning.ACCOUNT_STATUS_LOCKOUT)
          || acctStatus.equals(Provisioning.ACCOUNT_STATUS_LOCKED)) {
        return LmtpReply.RECIPIENT_OK;
      }

      ZimbraLog.lmtp.info("rejecting address " + addr + ": unknown account status " + acctStatus);
      return LmtpReply.NO_SUCH_USER;

    } catch (ServiceException e) {
      if (e.isReceiversFault()) {
        ZimbraLog.lmtp.warn("try again for address " + addr + ": exception occurred", e);
        return LmtpReply.MAILBOX_DISABLED;
      } else {
        ZimbraLog.lmtp.warn("rejecting address " + addr + ": exception occurred", e);
        return LmtpReply.NO_SUCH_USER;
      }
    }
  }