use of com.zimbra.common.service.ServiceException in project zm-mailbox by Zimbra.
the class LdapProvisioning method createDistributionList.
private DistributionList createDistributionList(String listAddress, Map<String, Object> listAttrs, Account creator) throws ServiceException {
SpecialAttrs specialAttrs = mDIT.handleSpecialAttrs(listAttrs);
String baseDn = specialAttrs.getLdapBaseDn();
listAddress = listAddress.toLowerCase().trim();
String[] parts = listAddress.split("@");
if (parts.length != 2)
throw ServiceException.INVALID_REQUEST("must be valid list address: " + listAddress, null);
String localPart = parts[0];
String domain = parts[1];
domain = IDNUtil.toAsciiDomainName(domain);
listAddress = localPart + "@" + domain;
validEmailAddress(listAddress);
CallbackContext callbackContext = new CallbackContext(CallbackContext.Op.CREATE);
callbackContext.setCreatingEntryName(listAddress);
AttributeManager.getInstance().preModify(listAttrs, null, callbackContext, true);
ZLdapContext zlc = null;
try {
zlc = LdapClient.getContext(LdapServerType.MASTER, LdapUsage.CREATE_DISTRIBUTIONLIST);
Domain d = getDomainByAsciiName(domain, zlc);
if (d == null)
throw AccountServiceException.NO_SUCH_DOMAIN(domain);
if (!d.isLocal()) {
throw ServiceException.INVALID_REQUEST("domain type must be local", null);
}
ZMutableEntry entry = LdapClient.createMutableEntry();
entry.mapToAttrs(listAttrs);
Set<String> ocs = LdapObjectClass.getDistributionListObjectClasses(this);
entry.addAttr(A_objectClass, ocs);
String zimbraIdStr = LdapUtil.generateUUID();
entry.setAttr(A_zimbraId, zimbraIdStr);
entry.setAttr(A_zimbraCreateTimestamp, LdapDateUtil.toGeneralizedTime(new Date()));
entry.setAttr(A_mail, listAddress);
// unlike accounts (which have a zimbraMailDeliveryAddress for the primary,
// and zimbraMailAliases only for aliases), DLs use zibraMailAlias for both.
// Postfix uses these two attributes to route mail, and zimbraMailDeliveryAddress
// indicates that something has a physical mailbox, which DLs don't.
entry.setAttr(A_zimbraMailAlias, listAddress);
// by default a distribution list is always created enabled
if (!entry.hasAttribute(Provisioning.A_zimbraMailStatus)) {
entry.setAttr(A_zimbraMailStatus, MAIL_STATUS_ENABLED);
}
String displayName = entry.getAttrString(Provisioning.A_displayName);
if (displayName != null) {
entry.setAttr(A_cn, displayName);
}
entry.setAttr(A_uid, localPart);
setGroupHomeServer(entry, creator);
String dn = mDIT.distributionListDNCreate(baseDn, entry.getAttributes(), localPart, domain);
entry.setDN(dn);
zlc.createEntry(entry);
DistributionList dlist = getDLBasic(DistributionListBy.id, zimbraIdStr, zlc);
if (dlist != null) {
AttributeManager.getInstance().postModify(listAttrs, dlist, callbackContext);
removeExternalAddrsFromAllDynamicGroups(dlist.getAllAddrsSet(), zlc);
allDLs.addGroup(dlist);
} else {
throw ServiceException.FAILURE("unable to get distribution list after creating LDAP entry: " + listAddress, null);
}
return dlist;
} catch (LdapEntryAlreadyExistException nabe) {
throw AccountServiceException.DISTRIBUTION_LIST_EXISTS(listAddress);
} catch (LdapException e) {
throw e;
} catch (AccountServiceException e) {
throw e;
} catch (ServiceException e) {
throw ServiceException.FAILURE("unable to create distribution list: " + listAddress, e);
} finally {
LdapClient.closeContext(zlc);
}
}
use of com.zimbra.common.service.ServiceException in project zm-mailbox by Zimbra.
the class LdapProvisioning method renameAddressesInAllDistributionLists.
protected void renameAddressesInAllDistributionLists(Map<String, String> changedPairs) {
String[] oldAddrs = changedPairs.keySet().toArray(new String[0]);
String[] newAddrs = changedPairs.values().toArray(new String[0]);
List<DistributionList> lists = null;
Map<String, String[]> attrs = null;
try {
lists = getAllDistributionListsForAddresses(oldAddrs, false);
} catch (ServiceException se) {
ZimbraLog.account.warn("unable to rename addr " + oldAddrs.toString() + " in all DLs ", se);
return;
}
for (DistributionList list : lists) {
// removeMember/addMember might have to update an entry's zimbraMemberId twice
if (attrs == null) {
attrs = new HashMap<String, String[]>();
attrs.put("-" + Provisioning.A_zimbraMailForwardingAddress, oldAddrs);
attrs.put("+" + Provisioning.A_zimbraMailForwardingAddress, newAddrs);
}
try {
modifyAttrs(list, attrs);
//list.removeMember(oldName)
//list.addMember(newName);
} catch (ServiceException se) {
// log warning an continue
ZimbraLog.account.warn("unable to rename " + oldAddrs.toString() + " to " + newAddrs.toString() + " in DL " + list.getName(), se);
}
}
}
use of com.zimbra.common.service.ServiceException in project zm-mailbox by Zimbra.
the class LdapProvisioning method getNonDefaultDynamicGroupMembers.
public String[] getNonDefaultDynamicGroupMembers(DynamicGroup group) {
final List<String> members = Lists.newArrayList();
ZLdapContext zlc = null;
try {
zlc = LdapClient.getContext(LdapServerType.REPLICA, LdapUsage.GET_GROUP_MEMBER);
/*
* this DynamicGroup object must not be a basic group with minimum
* attrs, we need the member attribute
*/
String[] memberDNs = group.getMultiAttr(Provisioning.A_member);
final String[] attrsToGet = new String[] { Provisioning.A_zimbraMailDeliveryAddress, Provisioning.A_zimbraIsExternalVirtualAccount };
for (String memberDN : memberDNs) {
ZAttributes memberAttrs = zlc.getAttributes(memberDN, attrsToGet);
String memberAddr = memberAttrs.getAttrString(Provisioning.A_zimbraMailDeliveryAddress);
boolean isVirtualAcct = memberAttrs.hasAttributeValue(Provisioning.A_zimbraIsExternalVirtualAccount, "TRUE");
if (memberAddr != null && !isVirtualAcct) {
members.add(memberAddr);
}
}
} catch (ServiceException e) {
ZimbraLog.account.warn("unable to get dynamic group members", e);
} finally {
LdapClient.closeContext(zlc);
}
return members.toArray(new String[members.size()]);
}
use of com.zimbra.common.service.ServiceException in project zm-mailbox by Zimbra.
the class LdapProvisioning method searchDynamicGroupInternalMemberDeliveryAddresses.
private void searchDynamicGroupInternalMemberDeliveryAddresses(ZLdapContext initZlc, String dynGroupId, final Collection<String> result) {
SearchLdapVisitor visitor = new SearchLdapVisitor(false) {
@Override
public void visit(String dn, IAttributes ldapAttrs) throws StopIteratingException {
String addr = null;
try {
addr = ldapAttrs.getAttrString(Provisioning.A_zimbraMailDeliveryAddress);
} catch (ServiceException e) {
ZimbraLog.account.warn("unable to get attr", e);
}
if (addr != null) {
result.add(addr);
}
}
};
ZLdapContext zlc = initZlc;
try {
if (zlc == null) {
// always use master to search for dynamic group members
zlc = LdapClient.getContext(LdapServerType.MASTER, LdapUsage.SEARCH);
}
searchDynamicGroupInternalMembers(zlc, dynGroupId, visitor);
} catch (ServiceException e) {
ZimbraLog.account.warn("unable to search dynamic group members", e);
} finally {
if (initZlc == null) {
LdapClient.closeContext(zlc);
}
}
}
use of com.zimbra.common.service.ServiceException in project zm-mailbox by Zimbra.
the class LdapProvisioning method getDynamicGroupByQuery.
private DynamicGroup getDynamicGroupByQuery(ZLdapFilter filter, ZLdapContext initZlc, boolean basicAttrsOnly) throws ServiceException {
try {
String[] returnAttrs = basicAttrsOnly ? BASIC_DYNAMIC_GROUP_ATTRS : null;
ZSearchResultEntry sr = helper.searchForEntry(mDIT.mailBranchBaseDN(), filter, initZlc, false, returnAttrs);
if (sr != null) {
return makeDynamicGroup(initZlc, sr.getDN(), sr.getAttributes());
}
} catch (LdapMultipleEntriesMatchedException e) {
throw AccountServiceException.MULTIPLE_ENTRIES_MATCHED("getDynamicGroupByQuery", e);
} catch (ServiceException e) {
throw ServiceException.FAILURE("unable to lookup group via query: " + filter.toFilterString() + " message:" + e.getMessage(), e);
}
return null;
}
Aggregations