Java tutorial
/* * ***** BEGIN LICENSE BLOCK ***** * * Zimbra Collaboration Suite Server * Copyright (C) 2010, 2011, 2012 VMware, Inc. * * The contents of this file are subject to the Zimbra Public License * Version 1.3 ("License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.zimbra.com/license. * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. * * ***** END LICENSE BLOCK ***** */ package org.zmail.bp; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.io.XMLWriter; import au.com.bytecode.opencsv.CSVWriter; import org.zmail.common.localconfig.LC; import org.zmail.common.mailbox.ContactConstants; import org.zmail.common.service.ServiceException; import org.zmail.common.soap.AdminExtConstants; import org.zmail.common.soap.Element; import org.zmail.common.util.EmailUtil; import org.zmail.cs.account.Account; import org.zmail.cs.account.Domain; import org.zmail.cs.account.GalContact; import org.zmail.cs.account.Provisioning; import org.zmail.cs.account.Provisioning.SearchGalResult; import org.zmail.cs.account.accesscontrol.AdminRight; import org.zmail.cs.account.accesscontrol.Rights.Admin; import org.zmail.cs.account.gal.GalOp; import org.zmail.cs.account.gal.GalParams; import org.zmail.cs.account.ldap.LdapGalMapRules; import org.zmail.cs.account.ldap.LdapGalSearch; import org.zmail.cs.ldap.LdapException; import org.zmail.cs.service.admin.AdminDocumentHandler; import org.zmail.cs.service.admin.AdminService; import org.zmail.soap.ZmailSoapContext; import org.zmail.cs.service.admin.AdminFileDownload; public class GenerateBulkProvisionFileFromLDAP extends AdminDocumentHandler { private static final String E_Options = "Options"; private static final String E_ZmailServer = "ZmailServer"; private static final String E_profile = "profile"; private static final String E_server = "server"; private static final String E_UserProvision = "UserProvision"; private static final String E_domain = "domain"; private static final String E_logonUserDN = "logonUserDN"; private static final String E_password = "password"; private static final String FILE_FORMAT_PREVIEW = "preview"; private static final int DEFAULT_PWD_LENGTH = 8; public Element handle(Element request, Map<String, Object> context) throws ServiceException { ZmailSoapContext zsc = getZmailSoapContext(context); Map<String, Object> attrs = AdminService.getAttrs(request, true); String password = null; Element elPassword = request.getOptionalElement(AdminExtConstants.A_password); if (elPassword != null) { password = elPassword.getTextTrim(); } String generatePwd = request.getElement(AdminExtConstants.A_generatePassword).getTextTrim(); Element elPasswordLength = request.getOptionalElement(AdminExtConstants.A_genPasswordLength); String fileFormat = request.getElement(AdminExtConstants.A_fileFormat).getTextTrim(); String mustChangePassword = request.getElement(AdminExtConstants.E_mustChangePassword).getTextTrim(); int genPwdLength = 0; if (generatePwd == null) { generatePwd = "false"; } else if (generatePwd.equalsIgnoreCase("true")) { if (elPasswordLength != null) { genPwdLength = Integer.valueOf(elPasswordLength.getTextTrim()); } else { genPwdLength = DEFAULT_PWD_LENGTH; } if (genPwdLength < 1) { genPwdLength = DEFAULT_PWD_LENGTH; } } int maxResults = 0; Element elMaxResults = request.getOptionalElement(AdminExtConstants.A_maxResults); if (elMaxResults != null) { maxResults = Integer.parseInt(elMaxResults.getTextTrim()); } GalParams.ExternalGalParams galParams = new GalParams.ExternalGalParams(attrs, GalOp.search); Element response = zsc.createElement(AdminExtConstants.GENERATE_BULK_PROV_FROM_LDAP_RESPONSE); String fileToken = Double.toString(Math.random() * 100); LdapGalMapRules rules = new LdapGalMapRules(Provisioning.getInstance().getConfig(), true); try { SearchGalResult result = LdapGalSearch.searchLdapGal(galParams, GalOp.search, "*", maxResults, rules, null, null); List<GalContact> entries = result.getMatches(); int totalAccounts = 0; int totalDomains = 0; int totalExistingDomains = 0; int totalExistingAccounts = 0; List<String> domainList = new ArrayList<String>(); if (entries != null) { String outFileName = null; if (FILE_FORMAT_PREVIEW.equalsIgnoreCase(fileFormat)) { String SMTPHost = ""; String SMTPPort = ""; Element eSMTPHost = request.getOptionalElement(AdminExtConstants.E_SMTPHost); if (eSMTPHost != null) { SMTPHost = eSMTPHost.getTextTrim(); } Element eSMTPPort = request.getOptionalElement(AdminExtConstants.E_SMTPPort); if (eSMTPPort != null) { SMTPPort = eSMTPPort.getTextTrim(); } for (GalContact entry : entries) { String mail = entry.getSingleAttr(ContactConstants.A_email); if (mail == null) continue; String parts[] = EmailUtil.getLocalPartAndDomain(mail); if (parts == null) continue; if (!domainList.contains(parts[1])) { totalDomains++; //Check if this domain is in Zmail Domain domain = Provisioning.getInstance().getDomainByName(parts[1]); if (domain != null) { totalExistingDomains++; } domainList.add(parts[1]); } totalAccounts++; Account acct = Provisioning.getInstance().getAccountByName(mail); if (acct != null) { totalExistingAccounts++; } } response.addElement(AdminExtConstants.E_totalCount).setText(Integer.toString(totalAccounts)); response.addElement(AdminExtConstants.E_domainCount).setText(Integer.toString(totalDomains)); response.addElement(AdminExtConstants.E_skippedAccountCount) .setText(Integer.toString(totalExistingAccounts)); response.addElement(AdminExtConstants.E_skippedDomainCount) .setText(Integer.toString(totalExistingDomains)); response.addElement(AdminExtConstants.E_SMTPHost).setText(SMTPHost); response.addElement(AdminExtConstants.E_SMTPPort).setText(SMTPPort); return response; } else if (AdminFileDownload.FILE_FORMAT_BULK_CSV.equalsIgnoreCase(fileFormat)) { outFileName = String.format("%s%s_bulk_%s_%s.csv", LC.zmail_tmp_directory.value(), File.separator, zsc.getAuthtokenAccountId(), fileToken); FileOutputStream out = null; CSVWriter writer = null; try { out = new FileOutputStream(outFileName); writer = new CSVWriter(new OutputStreamWriter(out)); for (GalContact entry : entries) { String mail = entry.getSingleAttr(ContactConstants.A_email); if (mail == null) continue; String[] line = new String[6]; line[0] = mail; line[1] = entry.getSingleAttr(ContactConstants.A_fullName); line[2] = entry.getSingleAttr(ContactConstants.A_firstName); line[3] = entry.getSingleAttr(ContactConstants.A_lastName); if (password != null) { line[4] = password; } else if (generatePwd.equalsIgnoreCase("true")) { line[4] = String.valueOf(BulkImportAccounts.generateStrongPassword(genPwdLength)); } line[5] = mustChangePassword; writer.writeNext(line); } writer.close(); } catch (IOException e) { throw ServiceException.FAILURE(e.getMessage(), e); } finally { if (writer != null) { try { writer.close(); } catch (IOException ignore) { } } if (out != null) { try { out.close(); } catch (IOException ignore) { } } } } else if (AdminFileDownload.FILE_FORMAT_BULK_XML.equalsIgnoreCase(fileFormat)) { outFileName = String.format("%s%s_bulk_%s_%s.xml", LC.zmail_tmp_directory.value(), File.separator, zsc.getAuthtokenAccountId(), fileToken); FileWriter fileWriter = null; XMLWriter xw = null; try { fileWriter = new FileWriter(outFileName); xw = new XMLWriter(fileWriter, org.dom4j.io.OutputFormat.createPrettyPrint()); Document doc = DocumentHelper.createDocument(); org.dom4j.Element rootEl = DocumentHelper.createElement(AdminExtConstants.E_ZCSImport); org.dom4j.Element usersEl = DocumentHelper.createElement(AdminExtConstants.E_ImportUsers); doc.add(rootEl); rootEl.add(usersEl); for (GalContact entry : entries) { String email = entry.getSingleAttr(ContactConstants.A_email); if (email == null) continue; org.dom4j.Element eUser = DocumentHelper.createElement(AdminExtConstants.E_User); org.dom4j.Element eName = DocumentHelper .createElement(AdminExtConstants.E_ExchangeMail); if (email != null) { eName.setText(email); } eUser.add(eName); org.dom4j.Element eDisplayName = DocumentHelper .createElement(Provisioning.A_displayName); String fullName = entry.getSingleAttr(ContactConstants.A_fullName); if (fullName != null) { eDisplayName.setText(fullName); } eUser.add(eDisplayName); org.dom4j.Element eGivenName = DocumentHelper.createElement(Provisioning.A_givenName); String firstName = entry.getSingleAttr(ContactConstants.A_firstName); if (firstName != null) { eGivenName.setText(firstName); } eUser.add(eGivenName); org.dom4j.Element eLastName = DocumentHelper.createElement(Provisioning.A_sn); String lastName = entry.getSingleAttr(ContactConstants.A_lastName); if (lastName != null) { eLastName.setText(lastName); } eUser.add(eLastName); org.dom4j.Element ePassword = DocumentHelper .createElement(AdminExtConstants.A_password); if (password != null) { ePassword.setText(password); } else if (generatePwd.equalsIgnoreCase("true")) { ePassword.setText( String.valueOf(BulkImportAccounts.generateStrongPassword(genPwdLength))); } eUser.add(ePassword); org.dom4j.Element elMustChangePassword = DocumentHelper .createElement(Provisioning.A_zmailPasswordMustChange); elMustChangePassword.setText(mustChangePassword); eUser.add(elMustChangePassword); usersEl.add(eUser); } xw.write(doc); xw.flush(); } catch (IOException e) { throw ServiceException.FAILURE(e.getMessage(), e); } finally { if (xw != null) { try { xw.close(); } catch (IOException ignore) { } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException ignore) { } } } } else if (AdminFileDownload.FILE_FORMAT_MIGRATION_XML.equalsIgnoreCase(fileFormat)) { outFileName = String.format("%s%s_migration_%s_%s.xml", LC.zmail_tmp_directory.value(), File.separator, zsc.getAuthtokenAccountId(), fileToken); FileWriter fileWriter = null; XMLWriter xw = null; try { fileWriter = new FileWriter(outFileName); xw = new XMLWriter(fileWriter, org.dom4j.io.OutputFormat.createPrettyPrint()); Document doc = DocumentHelper.createDocument(); org.dom4j.Element rootEl = DocumentHelper.createElement(AdminExtConstants.E_ZCSImport); doc.add(rootEl); /** * set Options section */ org.dom4j.Element optionsEl = DocumentHelper.createElement(E_Options); org.dom4j.Element importMailsEl = DocumentHelper .createElement(AdminExtConstants.E_importMails); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importMails).getTextTrim())) { importMailsEl.setText("1"); } else { importMailsEl.setText("0"); } optionsEl.add(importMailsEl); rootEl.add(optionsEl); org.dom4j.Element importContactsEl = DocumentHelper .createElement(AdminExtConstants.E_importContacts); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importContacts).getTextTrim())) { importContactsEl.setText("1"); } else { importContactsEl.setText("0"); } optionsEl.add(importContactsEl); org.dom4j.Element importCalendarEl = DocumentHelper .createElement(AdminExtConstants.E_importCalendar); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importCalendar).getTextTrim())) { importCalendarEl.setText("1"); } else { importCalendarEl.setText("0"); } optionsEl.add(importCalendarEl); org.dom4j.Element importTasksEl = DocumentHelper .createElement(AdminExtConstants.E_importTasks); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importTasks).getTextTrim())) { importTasksEl.setText("1"); } else { importTasksEl.setText("0"); } optionsEl.add(importTasksEl); org.dom4j.Element importJunkEl = DocumentHelper .createElement(AdminExtConstants.E_importJunk); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importJunk).getTextTrim())) { importJunkEl.setText("1"); } else { importJunkEl.setText("0"); } optionsEl.add(importJunkEl); org.dom4j.Element importDeletedItemsEl = DocumentHelper .createElement(AdminExtConstants.E_importDeletedItems); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_importDeletedItems).getTextTrim())) { importDeletedItemsEl.setText("1"); } else { importDeletedItemsEl.setText("0"); } optionsEl.add(importDeletedItemsEl); org.dom4j.Element ignorePreviouslyImportedEl = DocumentHelper .createElement(AdminExtConstants.E_ignorePreviouslyImported); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_ignorePreviouslyImported).getTextTrim())) { ignorePreviouslyImportedEl.setText("1"); } else { ignorePreviouslyImportedEl.setText("0"); } optionsEl.add(ignorePreviouslyImportedEl); org.dom4j.Element InvalidSSLOkEl = DocumentHelper .createElement(AdminExtConstants.E_InvalidSSLOk); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_InvalidSSLOk).getTextTrim())) { InvalidSSLOkEl.setText("1"); } else { InvalidSSLOkEl.setText("0"); } optionsEl.add(InvalidSSLOkEl); /** * set MapiProfile section */ org.dom4j.Element mapiProfileEl = DocumentHelper .createElement(AdminExtConstants.E_MapiProfile); rootEl.add(mapiProfileEl); org.dom4j.Element profileEl = DocumentHelper.createElement(E_profile); profileEl.setText(request.getElement(AdminExtConstants.E_MapiProfile).getTextTrim()); mapiProfileEl.add(profileEl); org.dom4j.Element serverEl = DocumentHelper.createElement(E_server); serverEl.setText(request.getElement(AdminExtConstants.E_MapiServer).getTextTrim()); mapiProfileEl.add(serverEl); org.dom4j.Element logonUserDNEl = DocumentHelper.createElement(E_logonUserDN); logonUserDNEl .setText(request.getElement(AdminExtConstants.E_MapiLogonUserDN).getTextTrim()); mapiProfileEl.add(logonUserDNEl); /** * set ZmailServer section */ org.dom4j.Element zmailSererEl = DocumentHelper.createElement(E_ZmailServer); rootEl.add(zmailSererEl); org.dom4j.Element serverNameEl = DocumentHelper .createElement(AdminExtConstants.E_serverName); serverNameEl.setText(Provisioning.getInstance().getLocalServer().getName()); zmailSererEl.add(serverNameEl); org.dom4j.Element adminUserNameEl = DocumentHelper .createElement(AdminExtConstants.E_adminUserName); adminUserNameEl .setText(request.getElement(AdminExtConstants.E_ZmailAdminLogin).getTextTrim()); zmailSererEl.add(adminUserNameEl); org.dom4j.Element adminUserPasswordEl = DocumentHelper.createElement(E_password); adminUserPasswordEl .setText(request.getElement(AdminExtConstants.E_ZmailAdminPassword).getTextTrim()); zmailSererEl.add(adminUserPasswordEl); org.dom4j.Element domaindEl = DocumentHelper.createElement(E_domain); domaindEl.setText(request.getElement(AdminExtConstants.E_TargetDomainName).getTextTrim()); zmailSererEl.add(domaindEl); /** * set UserProvision section */ org.dom4j.Element userProvisionEl = DocumentHelper.createElement(E_UserProvision); rootEl.add(userProvisionEl); org.dom4j.Element provisionUsersEl = DocumentHelper .createElement(AdminExtConstants.E_provisionUsers); if ("TRUE".equalsIgnoreCase( request.getElement(AdminExtConstants.E_provisionUsers).getTextTrim())) { provisionUsersEl.setText("1"); } else { provisionUsersEl.setText("0"); } userProvisionEl.add(provisionUsersEl); /** * set ImportUsers section */ org.dom4j.Element usersEl = DocumentHelper.createElement(AdminExtConstants.E_ImportUsers); rootEl.add(usersEl); for (GalContact entry : entries) { String email = entry.getSingleAttr(ContactConstants.A_email); if (email == null) continue; org.dom4j.Element eUser = DocumentHelper.createElement(AdminExtConstants.E_User); org.dom4j.Element eExchangeMail = DocumentHelper .createElement(AdminExtConstants.E_ExchangeMail); eExchangeMail.setText(email); eUser.add(eExchangeMail); org.dom4j.Element ePassword = DocumentHelper .createElement(AdminExtConstants.A_password); if (password != null) { ePassword.setText(password); } else if (generatePwd.equalsIgnoreCase("true")) { ePassword.setText( String.valueOf(BulkImportAccounts.generateStrongPassword(genPwdLength))); } eUser.add(ePassword); org.dom4j.Element elMustChangePassword = DocumentHelper .createElement(Provisioning.A_zmailPasswordMustChange); elMustChangePassword.setText(mustChangePassword); eUser.add(elMustChangePassword); usersEl.add(eUser); } xw.write(doc); xw.flush(); } catch (IOException e) { throw ServiceException.FAILURE(e.getMessage(), e); } finally { if (xw != null) { try { xw.close(); } catch (IOException ignore) { } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException ignore) { } } } } else { throw (ServiceException.INVALID_REQUEST("Wrong value for fileFormat parameter", null)); } response.addElement(AdminExtConstants.E_fileToken).setText(fileToken); } } catch (ServiceException e) { if (LdapException.INVALID_SEARCH_FILTER.equals(e.getCode()) || e.getCause() instanceof LdapException.LdapInvalidSearchFilterException) { throw BulkProvisionException.BP_INVALID_SEARCH_FILTER(e); } else { throw e; } } return response; } @Override public void docRights(List<AdminRight> relatedRights, List<String> notes) { relatedRights.add(Admin.R_accessGAL); } }