⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcldap.c

📁 一个功能全面的电子邮件客户端
💻 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 + -