1/*
2 *
3 * Portions Copyright 1998 Sun Microsystems, Inc.  All rights reserved.
4 * Use is subject to license terms.
5 *
6 */
7#pragma ident	"%Z%%M%	%I%	%E% SMI"
8#include <stdio.h>
9#include <sys/types.h>
10#include "lber.h"
11#include "ldap.h"
12#include "disptmpl.h"
13#include "srchpref.h"
14
15#ifdef MACOS
16#include <stdlib.h>
17#include <console.h>
18#endif /* MACOS */
19
20#ifdef NEEDPROTOS
21void dump_tmpl( struct ldap_disptmpl *tmpl );
22void dump_srchpref( struct ldap_searchobj *sp );
23#else /* NEEDPROTOS */
24void dump_tmpl();
25void dump_srchpref();
26#endif /* NEEDPROTOS */
27
28
29#define NULLSTRINGIFNULL( s )	( s == NULL ? "(null)" : s )
30
31
32int
33main( int argc, char **argv )
34{
35    struct ldap_disptmpl	*templates, *dtp;
36    struct ldap_searchobj	*so, *sop;
37    int				err;
38
39#ifdef MACOS
40	ccommand( &argv );
41	for ( argc = 0; argv[ argc ] != NULL; ++argc ) {
42	    ;
43	}
44	cshow( stdout );
45#endif /* MACOS */
46
47    if (( err = ldap_init_templates( "ldaptemplates.conf", &templates ))
48	    != 0 ) {
49	fprintf( stderr, "ldap_init_templates failed (%d)\n", err );
50	exit( 1 );
51    }
52
53    if (( err = ldap_init_searchprefs( "ldapsearchprefs.conf", &so ))
54	    != 0 ) {
55	fprintf( stderr, "ldap_init_searchprefs failed (%d)\n", err );
56	exit( 1 );
57    }
58
59    if ( argc == 1 ) {
60	printf( "*** Display Templates:\n" );
61	for ( dtp = ldap_first_disptmpl( templates ); dtp != NULLDISPTMPL;
62		dtp = ldap_next_disptmpl( templates, dtp )) {
63	    dump_tmpl( dtp );
64	    printf( "\n\n" );
65	}
66
67	printf( "\n\n*** Search Objects:\n" );
68	for ( sop = ldap_first_searchobj( so ); sop != NULLSEARCHOBJ;
69		    sop = ldap_next_searchobj( so, sop )) {
70	    dump_srchpref( sop );
71	    printf( "\n\n" );
72	}
73
74    } else {
75	if (( dtp = ldap_oc2template( ++argv, templates )) == NULL ) {
76	    fprintf( stderr, "no matching template found\n" );
77	} else {
78	    dump_tmpl( dtp );
79	}
80    }
81
82
83    ldap_free_templates( templates );
84    ldap_free_searchprefs( so );
85
86    exit( 0 );
87}
88
89
90static char *syn_name[] = {
91    "?", "CIS", "MLS", "DN", "BOOL", "JPEG", "JPEGBTN", "FAX", "FAXBTN",
92    "AUDIOBTN", "TIME", "DATE", "URL", "SEARCHACT", "LINKACT", "ADDDNACT",
93    "VERIFYACT",
94};
95
96static char *syn_type[] = {
97    "?", "txt", "img", "?", "bool", "?", "?", "?", "btn",
98    "?", "?", "?", "?", "?", "?", "?",
99    "action", "?"
100};
101
102static char *includeattrs[] = { "objectClass", "sn", NULL };
103
104static char *item_opts[] = {
105    "ro", "sort", "1val", "hide", "required", "hideiffalse", NULL
106};
107
108static unsigned long item_opt_vals[] = {
109    LDAP_DITEM_OPT_READONLY,		LDAP_DITEM_OPT_SORTVALUES,
110    LDAP_DITEM_OPT_SINGLEVALUED,	LDAP_DITEM_OPT_HIDEIFEMPTY,
111    LDAP_DITEM_OPT_VALUEREQUIRED,	LDAP_DITEM_OPT_HIDEIFFALSE,
112};
113
114
115void
116dump_tmpl( struct ldap_disptmpl *tmpl )
117{
118    struct ldap_tmplitem	*rowp, *colp;
119    int				i, rowcnt, colcnt;
120    char			**fetchattrs;
121    struct ldap_oclist		*ocp;
122    struct ldap_adddeflist	*adp;
123
124    printf( "** Template \"%s\" (plural \"%s\", icon \"%s\")\n",
125	    NULLSTRINGIFNULL( tmpl->dt_name ),
126	    NULLSTRINGIFNULL( tmpl->dt_pluralname ),
127	    NULLSTRINGIFNULL( tmpl->dt_iconname ));
128
129    printf( "object class list:\n" );
130    for ( ocp = tmpl->dt_oclist; ocp != NULL; ocp = ocp->oc_next ) {
131	for ( i = 0; ocp->oc_objclasses[ i ] != NULL; ++i ) {
132	    printf( "%s%s", i == 0 ? "  " : " & ",
133		    NULLSTRINGIFNULL( ocp->oc_objclasses[ i ] ));
134	}
135	putchar( '\n' );
136    }
137    putchar( '\n' );
138
139    printf( "template options:          " );
140    if ( tmpl->dt_options == 0L ) {
141	printf( "NONE\n" );
142    } else {
143	printf( "%s %s %s\n", LDAP_IS_DISPTMPL_OPTION_SET( tmpl,
144		LDAP_DTMPL_OPT_ADDABLE ) ? "addable" : "",
145		LDAP_IS_DISPTMPL_OPTION_SET( tmpl, LDAP_DTMPL_OPT_ALLOWMODRDN )
146		? "modrdn" : "",
147		LDAP_IS_DISPTMPL_OPTION_SET( tmpl, LDAP_DTMPL_OPT_ALTVIEW )
148		? "altview" : "" );
149    }
150
151    printf( "authenticate as attribute: %s\n", tmpl->dt_authattrname != NULL ?
152	    tmpl->dt_authattrname : "<default>" );
153
154    printf( "default RDN attribute:     %s\n", tmpl->dt_defrdnattrname != NULL ?
155	    tmpl->dt_defrdnattrname : "NONE" );
156
157    printf( "default add location:      %s\n", tmpl->dt_defaddlocation != NULL ?
158	    tmpl->dt_defaddlocation : "NONE" );
159
160    printf( "\nnew entry value default rules:\n" );
161    for ( adp = tmpl->dt_adddeflist; adp != NULL; adp = adp->ad_next ) {
162	if ( adp->ad_source == LDAP_ADSRC_CONSTANTVALUE ) {
163	    printf( "  attribute %s <-- constant value \"%s\"\n",
164		NULLSTRINGIFNULL( adp->ad_attrname),
165		NULLSTRINGIFNULL( adp->ad_value ));
166	} else {
167	    printf( "  attribute %s <-- adder's DN\n",
168		    NULLSTRINGIFNULL( adp->ad_attrname ));
169	}
170    }
171    putchar( '\n' );
172
173    printf( "\nfetch attributes & values:\n" );
174    if (( fetchattrs = ldap_tmplattrs( tmpl, includeattrs, 1,
175		LDAP_SYN_OPT_DEFER )) == NULL ) {
176	printf( "  <none>\n" );
177    } else {
178	for ( i = 0; fetchattrs[ i ] != NULL; ++i ) {
179	    printf( "  %s\n", fetchattrs[ i ] );
180	    free( fetchattrs[ i ] );
181	}
182	free( (char *)fetchattrs );
183    }
184
185    printf( "\nfetch attributes only:\n" );
186    if (( fetchattrs = ldap_tmplattrs( tmpl, NULL, 0,
187		LDAP_SYN_OPT_DEFER )) == NULL ) {
188	printf( "  <none>\n" );
189    } else {
190	for ( i = 0; fetchattrs[ i ] != NULL; ++i ) {
191	    printf( "  %s\n", fetchattrs[ i ] );
192	    free( fetchattrs[ i ] );
193	}
194	free( (char *)fetchattrs );
195    }
196
197    printf( "\ntemplate items:\n" );
198    rowcnt = 0;
199    for ( rowp = ldap_first_tmplrow( tmpl ); rowp != NULLTMPLITEM;
200	    rowp = ldap_next_tmplrow( tmpl, rowp )) {
201	++rowcnt;
202	colcnt = 0;
203	for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULLTMPLITEM;
204		colp = ldap_next_tmplcol( tmpl, rowp, colp )) {
205	    ++colcnt;
206	    printf( "  %2d-%d: %s (%s%s", rowcnt, colcnt,
207		syn_name[ colp->ti_syntaxid & 0x0000FFFF ],
208		syn_type[ LDAP_GET_SYN_TYPE( colp->ti_syntaxid ) >> 24 ],
209		(( LDAP_GET_SYN_OPTIONS( colp->ti_syntaxid ) &
210		LDAP_SYN_OPT_DEFER ) != 0 ) ? ",defer" : "" );
211
212	    for ( i = 0; item_opts[ i ] != NULL; ++i ) {
213		if ( LDAP_IS_TMPLITEM_OPTION_SET( colp, item_opt_vals[ i ] )) {
214		    printf( ",%s", NULLSTRINGIFNULL( item_opts[ i ] ));
215		}
216	    }
217
218	    printf( "), %s, %s", NULLSTRINGIFNULL( colp->ti_attrname ),
219		    NULLSTRINGIFNULL( colp->ti_label ));
220	    if ( colp->ti_args != NULL ) {
221		printf( ",args=" );
222		for ( i = 0; colp->ti_args[ i ] != NULL; ++i ) {
223		    printf( "<%s>", NULLSTRINGIFNULL( colp->ti_args[ i ] ));
224		}
225	    }
226
227	    putchar( '\n' );
228	}
229    }
230}
231
232
233void
234dump_srchpref( struct ldap_searchobj *so )
235{
236    int i;
237    struct ldap_searchattr *sa;
238    struct ldap_searchmatch *sm;
239
240    printf( "Object type prompt:  %s\n",
241	    NULLSTRINGIFNULL( so->so_objtypeprompt ));
242    printf( "Options:             %s\n",
243	    LDAP_IS_SEARCHOBJ_OPTION_SET( so, LDAP_SEARCHOBJ_OPT_INTERNAL ) ?
244	    "internal" : "NONE" );
245    printf( "Prompt:              %s\n", NULLSTRINGIFNULL( so->so_prompt ));
246    printf( "Scope:               " );
247    switch ( so->so_defaultscope ) {
248    case LDAP_SCOPE_BASE:
249	printf( "LDAP_SCOPE_BASE" );
250	break;
251    case LDAP_SCOPE_ONELEVEL:
252	printf( "LDAP_SCOPE_ONELEVEL" );
253	break;
254    case LDAP_SCOPE_SUBTREE:
255	printf( "LDAP_SCOPE_SUBTREE" );
256	break;
257    default:
258	printf("*** unknown!" );
259    }
260    puts( "\n" );
261    printf( "Filter prefix:       %s\n",
262	    NULLSTRINGIFNULL( so->so_filterprefix ));
263    printf( "Filter tag:          %s\n",
264	    NULLSTRINGIFNULL( so->so_filtertag ));
265    printf( "Default select attr: %s\n",
266	    NULLSTRINGIFNULL( so->so_defaultselectattr ));
267    printf( "Default select text: %s\n",
268	    NULLSTRINGIFNULL( so->so_defaultselecttext ));
269    printf( "Searchable attributes ---- \n" );
270    for ( sa = so->so_salist; sa != NULL; sa = sa->sa_next ) {
271	printf( "  Label: %s\n", NULLSTRINGIFNULL( sa->sa_attrlabel ));
272	printf( "  Attribute: %s\n", NULLSTRINGIFNULL( sa->sa_attr ));
273	printf( "  Select attr: %s\n", NULLSTRINGIFNULL( sa->sa_selectattr ));
274	printf( "  Select text: %s\n", NULLSTRINGIFNULL( sa->sa_selecttext ));
275	printf( "  Match types ---- \n" );
276	for ( i = 0, sm = so->so_smlist; sm != NULL; i++, sm = sm->sm_next ) {
277	    if (( sa->sa_matchtypebitmap >> i ) & 1 ) {
278		printf( "    %s (%s)\n",
279			NULLSTRINGIFNULL( sm->sm_matchprompt ),
280			NULLSTRINGIFNULL( sm->sm_filter ));
281	    }
282	}
283    }
284}
285