1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 
3 /*
4  * The contents of this file are subject to the Netscape Public
5  * License Version 1.1 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.mozilla.org/NPL/
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * The Original Code is Mozilla Communicator client code, released
15  * March 31, 1998.
16  *
17  * The Initial Developer of the Original Code is Netscape
18  * Communications Corporation. Portions created by Netscape are
19  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
20  * Rights Reserved.
21  *
22  * Contributor(s):
23  */
24 /*
25  *  Copyright (c) 1993 The Regents of the University of Michigan.
26  *  All rights reserved.
27  */
28 /*
29  *  cache.c - generic caching support for LDAP
30  */
31 
32 #include "ldap-int.h"
33 
34 /*
35  * ldap_cache_flush - flush part of the LDAP cache. returns an
36  * ldap error code (LDAP_SUCCESS, LDAP_NO_SUCH_OBJECT, etc.).
37  */
38 
39 int
40 LDAP_CALL
ldap_cache_flush(LDAP * ld,const char * dn,const char * filter)41 ldap_cache_flush( LDAP *ld, const char *dn, const char *filter )
42 {
43 	if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
44 		return( LDAP_PARAM_ERROR );
45 	}
46 
47 	if ( dn == NULL ) {
48 		dn = "";
49 	}
50 
51 	return( (ld->ld_cache_flush)( ld, dn, filter ) );
52 }
53 
54 /*
55  * nsldapi_add_result_to_cache - add an ldap entry we just read off the network
56  * to the ldap cache. this routine parses the ber for the entry and
57  * constructs the appropriate add request. this routine calls the
58  * cache add routine to actually add the entry.
59  */
60 
61 void
nsldapi_add_result_to_cache(LDAP * ld,LDAPMessage * m)62 nsldapi_add_result_to_cache( LDAP *ld, LDAPMessage *m )
63 {
64 	char		*dn;
65 	LDAPMod		**mods;
66 	int		i, max, rc;
67 	char		*a;
68 	BerElement	*ber;
69 	char		buf[50];
70 	struct berval	bv;
71 	struct berval	*bvp[2];
72 
73 	LDAPDebug( LDAP_DEBUG_TRACE, "=> nsldapi_add_result_to_cache id %d type %d\n",
74 	    m->lm_msgid, m->lm_msgtype, 0 );
75 	if ( m->lm_msgtype != LDAP_RES_SEARCH_ENTRY ||
76 	    ld->ld_cache_add == NULL ) {
77 		LDAPDebug( LDAP_DEBUG_TRACE,
78 		    "<= nsldapi_add_result_to_cache not added\n", 0, 0, 0 );
79 		return;
80 	}
81 
82 #define GRABSIZE	5
83 
84 	dn = ldap_get_dn( ld, m );
85 	mods = (LDAPMod **)NSLDAPI_MALLOC( GRABSIZE * sizeof(LDAPMod *) );
86 	if (mods == NULL) {
87 		LDAPDebug( LDAP_DEBUG_TRACE,
88 		    "<= nsldapi_add_result_to_cache malloc failed\n", 0, 0, 0 );
89 		return;
90 	}
91 	max = GRABSIZE;
92 	for ( i = 0, a = ldap_first_attribute( ld, m, &ber ); a != NULL;
93 	    a = ldap_next_attribute( ld, m, ber ), i++ ) {
94 		if ( i == (max - 1) ) {
95 			max += GRABSIZE;
96 			mods = (LDAPMod **)NSLDAPI_REALLOC( mods,
97 			    sizeof(LDAPMod *) * max );
98 			if (mods == NULL) {
99 				LDAPDebug( LDAP_DEBUG_TRACE,
100 				    "<= nsldapi_add_result_to_cache realloc failed\n",
101 				    0, 0, 0 );
102 				return;
103 			}
104 		}
105 
106 		mods[i] = (LDAPMod *)NSLDAPI_CALLOC( 1, sizeof(LDAPMod) );
107 		if (mods[i] == NULL) {
108 			LDAPDebug( LDAP_DEBUG_TRACE,
109 			    "<= nsldapi_add_result_to_cache calloc failed\n",
110 			    0, 0, 0 );
111 			ldap_mods_free( mods, 1 );
112 			return;
113 		}
114 		mods[i]->mod_op = LDAP_MOD_BVALUES;
115 		mods[i]->mod_type = a;
116 		mods[i]->mod_bvalues = ldap_get_values_len( ld, m, a );
117 	}
118 	if ( ber != NULL ) {
119 		ber_free( ber, 0 );
120 	}
121 	if (( rc = LDAP_GET_LDERRNO( ld, NULL, NULL )) != LDAP_SUCCESS ) {
122 		LDAPDebug( LDAP_DEBUG_TRACE,
123 		    "<= nsldapi_add_result_to_cache error: failed to construct mod list (%s)\n",
124 		    ldap_err2string( rc ), 0, 0 );
125 		ldap_mods_free( mods, 1 );
126 		return;
127 	}
128 
129 	/* update special cachedtime attribute */
130 	if ( i == (max - 1) ) {
131 		max++;
132 		mods = (LDAPMod **)NSLDAPI_REALLOC( mods,
133 		    sizeof(LDAPMod *) * max );
134 		if (mods == NULL) {
135 			LDAPDebug( LDAP_DEBUG_TRACE,
136 			    "<= nsldapi_add_result_to_cache calloc failed\n",
137 			    0, 0, 0 );
138 			ldap_mods_free( mods, 1 );
139 			return;
140 		}
141 	}
142 	mods[i] = (LDAPMod *)NSLDAPI_CALLOC( 1, sizeof(LDAPMod) );
143 	if (mods[i] == NULL) {
144 		LDAPDebug( LDAP_DEBUG_TRACE,
145 		    "<= nsldapi_add_result_to_cache calloc failed\n",
146 		    0, 0, 0 );
147 		ldap_mods_free( mods, 1 );
148 		return;
149 	}
150 	mods[i]->mod_op = LDAP_MOD_BVALUES;
151 	mods[i]->mod_type = "cachedtime";
152 	sprintf( buf, "%d", time( NULL ) );
153 	bv.bv_val = buf;
154 	bv.bv_len = strlen( buf );
155 	bvp[0] = &bv;
156 	bvp[1] = NULL;
157 	mods[i]->mod_bvalues = bvp;
158 	mods[++i] = NULL;
159 
160 	/* msgid of -1 means don't send the result */
161 	rc = (ld->ld_cache_add)( ld, -1, m->lm_msgtype, dn, mods );
162 	LDAPDebug( LDAP_DEBUG_TRACE,
163 	    "<= nsldapi_add_result_to_cache added (rc %d)\n", rc, 0, 0 );
164 }
165