📄 tcldap.c
字号:
/* TradeClient <http://tradeclient.sourceforge.net> * $Id: tcldap.c,v 1.22 2001/03/20 22:19:33 ttabner Exp $ * * Copyright (C) 1999-2000 Bynari Inc. * Copyright (C) 2001 Project TradeClient * * LGPL * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library * General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#ifndef GABNAME#define GABNAMEchar gabName[] = "* Global Address Book" ;#endif#ifdef WANTLDAP#include "tcldap.h"void ldap_memfree (void *p) { if (p) free (p);}void insert_wanted_value (LDAP *ld, LDAPMessage *ldmsg, char *attr, Abook_entry *abooke) { char **values; g_return_if_fail (abooke != NULL);/* values=ldap_get_values (ld, ldmsg, attr); for (i=0; i<ldap_count_values (values); i++) { printf ("%s: %s\n", attr, values[i]); } ldap_value_free (values);*/ /* if (!strncasecmp (attr, "rdn", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*//* if (!strncasecmp (attr, "cn", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*/ if (!strncasecmp (attr, "comment", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->notes=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "mail", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abook_entry_add_email (abooke, values[0]); abook_entry_set_default (abooke, values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "initials", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->middle=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "postalAddress", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cstreet=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "homepostaladdress", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->street=strdup(values[0]); ldap_value_free (values); } } /* if (!strncasecmp (attr, "secretary", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cassistant=strdup(values[0]); ldap_value_free (values); } } */ if (!strncasecmp (attr, "o", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->company=strdup(values[0]); ldap_value_free (values); } }/* if (!strncasecmp (attr, "department", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*//* if (!strncasecmp (attr, "name", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*/ if (!strncasecmp (attr, "givenname", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->first=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "l", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->ccity=strdup(values[0]); ldap_value_free (values); } }/* if (!strncasecmp (attr, "physicalDeliveryOfficeName", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*/ if (!strncasecmp (attr, "postalCode", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->czip=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "st", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cstate=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "sn", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->last=strdup(values[0]); ldap_value_free (values); } }/* if (!strncasecmp (attr, "Telephone-Assistant", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*/ if (!strncasecmp (attr, "otherfacsimiletelephonenumber", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->fax=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "facsimiletelephonenumber", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cfax=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "homephone", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->hphone=strdup(values[0]); ldap_value_free (values); } }/* if (!strncasecmp (attr, "Telephone-Home2", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->=strdup(values[0]); ldap_value_free (values); } }*/ if (!strncasecmp (attr, "mobile", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->mphone=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "telephoneNumber", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cphone1=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "otherphone", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->cphone2=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "pager", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->pager=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "co", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->ccountry=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "url", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->webpage=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "title", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->position=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "dn", strlen (attr))) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->dn=strdup(values[0]); ldap_value_free (values); } } if (!strncasecmp (attr, "cn", 2)) { if ( (values=ldap_get_values (ld, ldmsg, attr)) ) { abooke->nickname=strdup(values[0]); ldap_value_free (values); } }}/* assumes simple auth */LDAP *ldap_logon (char *host, int port, char *dn, char *pass) { LDAP *ld; int id;#ifdef LDAP_CACHE static int cache = 0 ;#endif if (!host) return NULL; ld=ldap_open( host, port ) ; if (!ld) { perror ("ldap_open failed" ) ; return NULL; }#ifdef LDAP_CACHE else { if( !cache ) { /* * Now, enable client side caching!!! * This will keep a cache for 10-minutes. It should result * in a much lower performance hit when doing back to back * queries while still making sure our cache doesn't get too * old. Notice that we will not limit our memory use. This * should be a big help for large LDAP installations and help * us be a nicer netizen to the LDAP server. */ ldap_enable_cache( ld, 10*60, 0 ) ; cache++ ;#ifdef DEBUG printf( "LDAP Caching has been enabled and set for 60-seconds\n" ) ;#endif } }#endif #if DEBUG > 4 printf ("LDAP Connection to '%s' with dn='%s'\n", host, dn);#endif /* if we need to change anything with the LDAP * var, we do it here */ id=ldap_bind_s (ld, dn, pass, LDAP_AUTH_SIMPLE); if (id>1) { ldap_perror (ld, "ldap_bind failed"); ldap_unbind (ld); return NULL; } return ld;}/* Incase we need to tie up loose ends befor logging off */void ldap_logoff (LDAP *ld) {#if DEBUG > 4 printf ("LDAP Logging off .. ");#endif#if 0 fflush (stdout);#endif ldap_unbind (ld);#if DEBUG > 4 printf ("LDAP Done.\n");#endif}int ldap_get_GAB (LDAP *ld, char *basedn, char *filter) { int nentries, i; LDAPMessage *res; LDAPMessage *ldmsg; BerElement *ldber; Abook *abook; Abook_entry *entry; Abook_group *grp; char **values; char **values2; char *attr, *search="mail=*"; char *searchfor = NULL; int retcode; abook=abook_seek_by_name( gabName ) ; if (!abook) { abook=abook_new (); abook->name=strdup( gabName ) ; } else { abook_destroy_entries (abook); } if ((filter)&&(strlen (filter))) { searchfor = malloc ((strlen (filter) + 7) * sizeof (char)); sprintf (searchfor, "cn=%s*", filter); } else searchfor = strdup (search); /* Disable any client side size restrictions while being extra paranoid! */ ld -> ld_sizelimit = 0 ; retcode = ldap_search_s (ld, basedn, LDAP_SCOPE_SUBTREE, searchfor, NULL, 0, &res); if( (retcode != LDAP_SUCCESS) && (retcode != LDAP_SIZELIMIT_EXCEEDED) && (retcode != LDAP_TIMELIMIT_EXCEEDED) ) { ldap_perror (ld, "ldap_search_s failed"); ldap_unbind(ld); return FALSE; } if (searchfor) free (searchfor); nentries=ldap_count_entries (ld, res);#if DEBUG > 4 printf ("LDAP Found %d results in database at DN: '%s'\n", nentries, basedn);#endif if (retcode == LDAP_SIZELIMIT_EXCEEDED) insert_warning (_("LDAP size-limit exceeded, %d results returned from server in \"%s\".\n"), nentries, basedn); else if (retcode == LDAP_TIMELIMIT_EXCEEDED) insert_warning (_("LDAP time-limit exceeded, %d results returned from server in \"%s\".\n"), nentries, basedn); for (ldmsg=ldap_first_entry (ld, res); ldmsg != NULL; ldmsg=ldap_next_entry (ld, ldmsg)) { values=ldap_get_values (ld, ldmsg, "objectClass"); if( values ) { if (!strncmp (values[0], "organizationalPerson", strlen (values[0]))) { entry=abook_entry_new (abook); for (attr=ldap_first_attribute (ld, ldmsg, &ldber); attr != NULL; attr=ldap_next_attribute (ld, ldmsg, ldber)) { insert_wanted_value (ld, ldmsg, attr, entry); } } else if (!strncmp (values[0], "groupOfNames", strlen (values[0]))) { values2=ldap_get_values (ld, ldmsg, "cn");#if DEBUG > 4 printf ("LDAP Mailing group: %s\n", values2[0]);#endif grp=abook_group_seek (abook, values2[0]); if (!grp) { grp=abook_group_new (abook); grp->name=strdup (values2[0]); } ldap_value_free (values2); values2=ldap_get_values (ld, ldmsg, "rfc822Mailbox"); grp->email=strdup (values2[0]); ldap_value_free (values2); values2=ldap_get_values (ld, ldmsg, "member"); for (i=0; i<ldap_count_values (values2); i++) { // printf ("%s: %s\n", "member", values2[i]); grp->members=g_list_append (grp->members, strdup (values2[i])); /***********************************************************/ // values[i] is the dn of the member // abook_group_add_member (grp, entry); /***********************************************************/ } ldap_value_free (values2); } ldap_value_free (values); } } ldap_msgfree (res);#if DEBUG > 4 printf ("LDAP Finished Query.\n");#endif abook_resolve_dnames (abook); return TRUE;}void update_gab (char *host, int port, char *basedn, char *udn, char *passwd, char *filter) { char *tmpdn=(char *)calloc (strlen(basedn)+strlen(udn)+6, sizeof(char)); LDAP *ld; /* NOTE: broke freeze and switched last two arguments of following line */ if (strlen (udn)) snprintf (tmpdn, strlen(basedn)+strlen(udn)+4, "%s, %s", udn, basedn); else snprintf (tmpdn, strlen(basedn)+4, "%s", basedn); ld=ldap_logon (host, port, tmpdn, passwd); if (ld) { if (ldap_get_GAB (ld, basedn, filter)) ldap_logoff (ld); } free (tmpdn);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -