LDAP2Vuser.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0
  3.  *
  4.  * Copyright (c) 1999, 2000 Vovida Networks, Inc.  All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  *
  18.  * 3. The end-user documentation included with the redistribution,
  19.  *    if any, must include the following acknowledgment:
  20.  *       "This product includes software developed by Vovida Networks,
  21.  *        Inc. (http://www.vovida.org/)."
  22.  *    Alternately, this acknowledgment may appear in the software itself,
  23.  *    if and wherever such third-party acknowledgments normally appear.
  24.  *
  25.  * 4. The names "VOCAL", "Vovida Open Communication Application Library",
  26.  *    and "Vovida Open Communication Application Library (VOCAL)" must 
  27.  *    not be used to endorse or promote products derived from this 
  28.  *    software without prior written permission. For written permission, 
  29.  *    please contact vocal@vovida.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "VOCAL",
  32.  *    nor may "VOCAL" appear in their name, without prior written
  33.  *    permission of Vovida Networks, Inc.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL VOVIDA NETWORKS, INC. OR ITS 
  39.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by Vovida 
  50.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  51.  * Inc.  For more information on Vovida Networks, Inc., please see 
  52.  * <http://www.vovida.org/>.
  53.  *
  54.  */
  55. static const char* const LDAP2Vuser_cxx_Version =
  56.     "$Id: LDAP2Vuser.cxx,v 1.13 2001/03/21 03:41:39 icahoon Exp $";
  57. #include "global.h"
  58. #include <strstream>
  59. #include "FileDataStore.hxx"
  60. #include "VIoException.hxx"
  61. #include "LDAP2Vuser.hxx"
  62. #include <cassert>
  63. // Attribute not found in LDAP
  64. static const char* const PHONE_NOT_IN_LDAP = "nonumber";
  65. static const char* const IP_NOT_IN_LDAP = "xxx.xxx.xxx.xxx";
  66. static const char* const FNA_NOT_IN_LDAP = "1111";
  67. static const char* const CFB_NOT_IN_LDAP = "2222";
  68. // Max user record file size is 1Mb
  69. static const unsigned int MAX_FILE_SIZE = 1048576;
  70. // Constructor -- opens connection with LDAP server as authenticated user
  71. LDAP2Vuser::LDAP2Vuser(string &host, unsigned int port, string &basedn, 
  72.                        string &binddn, string &bindpw):
  73. myLdapHost(host),
  74. myLdapPort(port),
  75. myLdapBasedn(basedn),
  76. myLdapBinddn(binddn),
  77. myLdapBindpw(bindpw)
  78. {
  79.     myLdapHandle = 0;
  80.     assert(initialize());
  81.     assert(authenticate());
  82.     setSizelimit(500);
  83. }
  84. // Constructor -- opens connection with LDAP server as nobody
  85. LDAP2Vuser::LDAP2Vuser(string &host, unsigned int port, string &basedn):
  86. myLdapHost(host),
  87. myLdapPort(port),
  88. myLdapBasedn(basedn)
  89. {
  90.     myLdapHandle = 0;
  91.     assert(initialize());
  92. }
  93. // Destructor -- unbinds from LDAP
  94. LDAP2Vuser::~LDAP2Vuser()
  95. {
  96.     ldap_unbind(myLdapHandle);
  97. }
  98. // Initialize LDAP session
  99. bool 
  100. LDAP2Vuser::initialize()
  101. {
  102.     char host_buff[128];
  103.     char ldapperrormsg[20] = "ldap_init";
  104.     // Pass non-consts char* to LDAP API functions
  105.     strncpy(host_buff, myLdapHost.c_str(), myLdapHost.length()+1);
  106.     
  107.     if ((myLdapHandle = ldap_init(host_buff, myLdapPort) ) == NULL )
  108.     {
  109.         ldap_perror( myLdapHandle, ldapperrormsg );
  110.         return(false);
  111.     }
  112.     return(true);
  113. }
  114. //  Authenticate to LDAP server as nobody
  115. bool 
  116. LDAP2Vuser::authenticate()
  117. {
  118.     char binddn_buff[128];
  119.     char bindpw_buff[128];
  120.     char ldapperrormsg[20] = "ldap_simple_bind_s";
  121.     // Pass non-consts char* to LDAP API functions
  122.     strncpy(binddn_buff, myLdapBinddn.c_str(), myLdapBinddn.length()+1);
  123.     strncpy(bindpw_buff, myLdapBindpw.c_str(), myLdapBindpw.length()+1);
  124.     
  125.     if (ldap_simple_bind_s(myLdapHandle, binddn_buff, bindpw_buff)
  126.         != LDAP_SUCCESS)
  127.     {
  128.         ldap_perror( myLdapHandle, ldapperrormsg );
  129.         return(false);
  130.     }
  131.     return(true);
  132. }
  133. // Set new search size limit
  134. void
  135. LDAP2Vuser::setSizelimit(int szlimit)
  136. {
  137. #if defined(LDAP_OPT_SIZELIMIT)
  138.     ldap_set_option(myLdapHandle, LDAP_OPT_SIZELIMIT, &szlimit);
  139. #else
  140.     myLdapHandle->ld_sizelimit = szlimit;
  141. #endif
  142. }
  143. // Get search size limit
  144. const int
  145. LDAP2Vuser::getSizelimit()
  146. {
  147. #if defined(LDAP_OPT_SIZELIMIT)
  148.     int limit;
  149.     ldap_get_option(myLdapHandle, LDAP_OPT_SIZELIMIT, &limit);
  150.     return ( limit );
  151. #else
  152.     return myLdapHandle->ld_sizelimit;
  153. #endif
  154. }
  155. //  Create XML file for given entry
  156. void 
  157. LDAP2Vuser::createXmlbuffer(char* filebuffer, const string& phonenumber,
  158.        const string& ip, const string& fna, const string& cfb)
  159. {
  160.     strstream buf(filebuffer, MAX_FILE_SIZE);
  161.     buf << "<user><name>" << phonenumber << "</name>" << endl
  162.     << "<password>6f7d5634f65192a3b9c8479cee3b655</password>" << endl
  163.     << "<ipaddr>" << ip << "</ipaddr>" << endl
  164.     << "<marshalgroup>UserAgentGroup</marshalgroup>" << endl
  165.     << "<staticRegistration value="false"><terminatingContactList><contact value="UserAgentGroup"></contact>" << endl
  166.     << "<contact value="xxx.xxx.xxx.xxx:yyyy"></contact>" << endl
  167.     << "</terminatingContactList>" << endl
  168.     << "</staticRegistration>" << endl
  169.     << "<authenticationType value="Access list"><authenticationPassword value="password"></authenticationPassword>" << endl
  170.     << "</authenticationType>" << endl
  171.     << "<failurecase>unknown</failurecase>" << endl
  172.     << "<cfa enabled="false"><setfeat>OFF</setfeat>" << endl
  173.     << "<featuregroup>ForwardAllCallsGroup</featuregroup>" << endl
  174.     << "<forwardto>none</forwardto>" << endl
  175.     << "</cfa>" << endl
  176.     << "<fnab enabled="false"><setfeat>OFF</setfeat>" << endl
  177.     << "<featuregroup>ForwardNoAnswerBusyGroup</featuregroup>" << endl
  178.     << "<fna set="false"><forwardto>" << fna << "</forwardto>" << endl
  179.     << "</fna>" << endl
  180.     << "<cfb set="false"><forwardto>" << cfb << "</forwardto>" << endl
  181.     << "</cfb>" << endl
  182.     << "</fnab>" << endl
  183.     << "<cs enabled="false"><setfeat>OFF</setfeat>" << endl
  184.     << "<featuregroup>CallScreeningGroup</featuregroup>" << endl
  185.     << "</cs>" << endl
  186.     << "<clbl enabled="false"><setfeat>OFF</setfeat>" << endl
  187.     << "<featuregroup>CallBlockingGroup</featuregroup>" << endl
  188.     << "<nineHundredBlocked adminSet="false" userSet="false"></nineHundredBlocked>" << endl
  189.     << "<longDistanceBlocked adminSet="false" userSet="false"></longDistanceBlocked>" << endl
  190.     << "</clbl>" << endl
  191.     << "<jtapi enabled="true"><setfeat>ON</setfeat>" << endl
  192.     << "<featuregroup>JtapiGroup</featuregroup>" << endl
  193.     << "</jtapi>" << endl
  194.     << "<callReturn enabled="false"><setfeat>OFF</setfeat>" << endl
  195.     << "<featuregroup>CallReturnGroup</featuregroup>" << endl
  196.     << "</callReturn>" << endl
  197.     << "<callerIdBlocking enabled="false"><setfeat>OFF</setfeat>" << endl
  198.     << "<featuregroup>CallerIdBlockingGroup</featuregroup>" << endl
  199.     << "</callerIdBlocking>" << endl
  200.     << "<voicemail enabled="false"><setfeat>OFF</setfeat>" << endl
  201.     << "<featuregroup>VoiceMailGroup</featuregroup>" << endl
  202.     << "</voicemail>" << endl
  203.     << "<aliases></aliases>" << endl
  204.     << "</user>" << endl
  205.     << ends;
  206. //    return(void);
  207. }
  208. // Strip spaces from telephone number 
  209. void
  210. LDAP2Vuser::stripSpaces(string& phoneNumber)
  211. {
  212.     string buff = phoneNumber;
  213.     string::iterator buff_i = buff.begin();
  214.     string::iterator phoneNumber_i = phoneNumber.begin();
  215.     int spaceCount = 0;
  216.     while (buff_i != buff.end())
  217.     {
  218.         if (*buff_i != ' ')
  219.         {
  220.             *phoneNumber_i++ = *buff_i++;
  221.         }
  222.         else
  223.         {
  224.             buff_i++;
  225.             spaceCount++;
  226.         }
  227.     }
  228.     phoneNumber.resize(phoneNumber.length() - spaceCount);
  229. }
  230. // Find matches in LDAP server
  231. const int
  232. LDAP2Vuser::exportUsers(const int hashkey, const string &outputdir)
  233. {
  234.     LDAPMessage* result;
  235.     LDAPMessage* entry;
  236.     int retCode;
  237.     int msgid;
  238.     int numEntries = 0;
  239.     bool finished;
  240.     char filebuffer[MAX_FILE_SIZE];
  241.     char basedn_buff[128];
  242.     string phonenumber;
  243.     string ip;
  244.     string fna;
  245.     string cfb;
  246.     char** attr_telephonenumber;
  247.     char** attr_vocalPhonenumber;
  248.     char** attr_vocalIP;
  249.     char** attr_vocalFNA;
  250.     char** attr_vocalCFB;
  251.     char ldapperrormsg1[] = "ldap_search";
  252.     char ldapperrormsg2[] = "ldap_result";
  253.     char search_filter[] = "(objectclass=*)";
  254.     char attr_key1[] = "telephonenumber";
  255.     char attr_key2[] = "vocalphonenumber";
  256.     char attr_key3[] = "vocalip";
  257.     char attr_key4[] = "vocalfna";
  258.     char attr_key5[] = "vocalcfb";
  259.     FileDataStore userdb(hashkey, outputdir);
  260.     // Pass non-consts char* to LDAP API functions
  261.     strncpy(basedn_buff, myLdapBasedn.c_str(), myLdapBasedn.length()+1);
  262.     // Search 
  263.     if ((msgid = ldap_search(myLdapHandle, basedn_buff, LDAP_SCOPE_SUBTREE, search_filter, NULL, 0 )) < 0 )
  264.     {
  265.         ldap_perror( myLdapHandle, ldapperrormsg1 );
  266.         return ( -1 );
  267.     }
  268.     // Loop, polling for results until finished
  269.     finished = 0;
  270.     while ( !finished )
  271.     {
  272.         result = NULL;
  273.         retCode = ldap_result( myLdapHandle, msgid, 0, NULL, &result );
  274.         if (retCode == -1) 
  275.         {
  276.             // some error occurred
  277.             ldap_perror( myLdapHandle, ldapperrormsg2 );
  278.             return ( -1 );
  279.         }
  280.         else 
  281.         if (retCode == 0) 
  282.         {
  283.             // Timeout was exceeded.  No entries are ready for retrieval. 
  284.             if ( result != NULL )
  285.             {
  286.                 ldap_msgfree( result );
  287.             }
  288.         }
  289.         /*
  290.          * Either an entry is ready for retrieval, or all entries have
  291.          * been retrieved.
  292.          */
  293.         else
  294.         if (( entry = ldap_first_entry( myLdapHandle, result )) == NULL )
  295.         {
  296.             // All done 
  297.             finished = true;
  298.             if ( result != NULL )
  299.             {
  300.                 ldap_msgfree( result );
  301.             }
  302.             continue;
  303.         }
  304.         // for each entry ...
  305.         if ((attr_telephonenumber =
  306.              ldap_get_values(myLdapHandle, entry, attr_key1))
  307.              != NULL)
  308.         {
  309.             numEntries++;
  310.             if ((attr_vocalPhonenumber = ldap_get_values(myLdapHandle, 
  311.                 entry, attr_key2)) != NULL)
  312.             {
  313.                 phonenumber = attr_vocalPhonenumber[0];
  314.                 // Strip any spaces from LDAP phone number 
  315.                 stripSpaces(phonenumber);
  316.             }
  317.             else
  318.             {
  319.                 phonenumber = PHONE_NOT_IN_LDAP;
  320.             }
  321.             if ((attr_vocalIP = ldap_get_values(myLdapHandle, entry,
  322.                  attr_key3)) != NULL)
  323.             {
  324.                 ip = attr_vocalIP[0];
  325.             }
  326.             else
  327.             {
  328.                 ip = IP_NOT_IN_LDAP;
  329.             }
  330.             if ((attr_vocalFNA = ldap_get_values(myLdapHandle, entry, 
  331.                  attr_key4)) != NULL)
  332.             {
  333.                 fna = attr_vocalFNA[0];
  334.             }
  335.             else
  336.             {
  337.                 fna = FNA_NOT_IN_LDAP;
  338.             }
  339.             if ((attr_vocalCFB = ldap_get_values(myLdapHandle, entry, 
  340.                  attr_key5)) != NULL)
  341.             {
  342.                 cfb = attr_vocalCFB[0];
  343.             }
  344.             else
  345.             {
  346.                 cfb = CFB_NOT_IN_LDAP;
  347.             }
  348.             // Set filebuffer to xml output
  349.             createXmlbuffer(filebuffer, phonenumber, ip, fna, cfb);
  350.             // Create a vocal user file for each entry
  351.             cout << "Exporting: " << phonenumber << endl;
  352.             try 
  353.             {
  354.     
  355.                 userdb.putItem("Accounts", phonenumber, filebuffer);
  356.             }
  357.             catch (VException& e)
  358.             {
  359.                 cerr << "putItem failed, reason: " <<
  360.                    e.getDescription() << endl;
  361.                 exit(-1);
  362.             }
  363.             // Free each entry attributes
  364.             ldap_value_free(attr_vocalPhonenumber);
  365.             ldap_value_free(attr_vocalIP);
  366.             ldap_value_free(attr_vocalFNA);
  367.             ldap_value_free(attr_vocalCFB);
  368.         }
  369.         ldap_msgfree( result );
  370.     }
  371.     cout << numEntries << " Entries exported" << endl; 
  372.     return (numEntries);
  373. }