]> git.sur5r.net Git - openldap/blob - contrib/tweb/html.c
fixed test on "" (empty) parent dn
[openldap] / contrib / tweb / html.c
1 /*_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
2 *                                                                          *
3 * html.c.....                                                              *
4 *                                                                          *
5 * Function:..WorldWideWeb-X.500-Gateway - HTML-Procedures                  *
6 *            Based on web500gw.c 1.3 written by Frank Richter, TU Chemmniz *
7 *            which is based on go500gw by Tim Howes, University of         *
8 *            Michigan  - All rights reserved                               *
9 *                                                                          *
10 * Authors:...Dr. Kurt Spanier & Bernhard Winkler,                          *
11 *            Zentrum fuer Datenverarbeitung, Bereich Entwicklung           *
12 *            neuer Dienste, Universitaet Tuebingen, GERMANY                *
13 *                                                                          *
14 *                                       ZZZZZ  DDD    V   V                *
15 *            Creation date:                Z   D  D   V   V                *
16 *            August 16 1995               Z    D   D   V V                 *
17 *            Last modification:          Z     D  D    V V                 *
18 *            May 28 1999                ZZZZ   DDD      V                  *
19 *                                                                          *
20 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_*/
21
22 /*
23  * $Id: html.c,v 1.6 1999/09/10 15:01:17 zrnsk01 Exp $
24  *
25  */
26
27 #include "tgeneral.h"
28 #include "tglobal.h"
29 #include "html.h"
30 #include "init_exp.h"
31 #include "support_exp.h"
32
33 #ifdef TUETEL
34 #include "tueTel_exp.h"
35 #endif
36
37 PUBLIC void print_attr(ld, fp, dn, label, tattr, e, flag, doNotShow, glob)
38 LDAP *ld;
39 FILE *fp;
40 char *dn;
41 char *label;
42 char *tattr;
43 LDAPMessage *e;
44 int  flag;
45 char *doNotShow;
46 GLOB_STRUCT *glob;
47 {
48     char    **val;
49     int    i, gotone = 0, firstline = TRUE, valid_label = FALSE;
50     static char *nlabel;
51     char    imageChar = 'J';
52     char strbuf[BUFSIZ];
53     int first_of_same = TRUE;
54
55     nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm); 
56
57     if ( (val = ldap_get_values( ld, e, tattr )) == NULL )
58         return;
59
60         /* check if only 1 value and this one is in "doNotShow"
61         if((doNotShow) && (val[1] == NULL) && (strcmp(val[0],doNotShow) == 0))
62             return;
63         */
64
65     for ( i = 0; val[i]; i++ ) {
66
67         sprintf(strbuf, "(%s)", glob->la[0]);
68         if(!strncasecmp(val[i], strbuf, 4)) {
69             strcpy(val[i], val[i]+4);
70         }
71         else if(val[i][0] == '(' && val[i][3] == ')' ) {
72             val[i][0] = '\0';
73             continue;
74         }
75
76         if (!doNotShow || strncasecmp (val[i], doNotShow, strlen (val[i])))
77             valid_label = TRUE;
78         else
79             val[i][0] = '\0';
80     }
81
82     if(!valid_label) {
83
84         ldap_value_free (val);
85         return;
86
87     }
88
89     fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel );
90
91         /* handle photo-requests */
92         if((flag == BMP) || (flag == JPEG2GIF) || (flag == JPEG)) {
93             photof(fp, flag, imageChar, dn, tattr);
94             return;
95         }
96
97     for ( i = 0; val[i] != NULL; i++ ) {
98
99         char *vali;
100
101         if(!*label ) first_of_same = FALSE;
102
103         if(!*val[i]) continue;
104
105         vali = char2html(val[i]);
106
107         if (flag == URL) {
108             urlf(fp, vali);
109
110 #ifdef TUE_TEL
111         } else if (flag == TFUNCPERS) {
112             tfuncpersf(fp, vali, ld, glob);
113 #endif
114
115         } else if (flag == DYNAMICDN) {
116             dynamicdnf(fp, vali, glob);
117
118         } else if (flag == INDEXURL) {
119             indexurlf(fp, vali, dn, glob);
120
121         } else if (flag == URI) {
122             urif(fp, vali, glob);
123
124         } else if (flag == PGPKEY) {
125             pgpkeyf(fp, vali, &firstline);
126
127         } else if ( ( flag == MULTILINE ) || (strchr(vali, '$') && 
128                                     strncmp(vali, "{T.61}", 6) != 0 )) {
129             multilinef(fp, vali, &first_of_same, &firstline, &gotone, nlabel);
130
131         } else if (flag == BOOLEAN) {
132             booleanf(fp, val[i], glob);
133
134         } else if (flag == DATE) {
135             datef(fp, val[i]);
136
137         } else if (flag == MAILTO) {
138             mailtof(fp, val[i], vali);
139
140         } else if (flag == HREF) {
141             hreff(fp, val[i], vali, glob);
142
143         } else if (flag == MOVETO) {
144             movetof(fp, val[i], vali, glob);
145
146         } else if (flag == PRE) {
147             pref(fp, vali, glob);
148
149         } else if (flag == HEADER) {
150             headerf(fp, vali, glob);
151
152         } else if (flag == REFERRAL) {
153             referralf(fp, vali, glob);
154
155 #ifdef TUE_TEL
156         } else if(flag == FAXTABLE) {
157             faxtablef(fp, val, &firstline);
158 #endif
159
160         } else
161             defaultf(fp, vali, &firstline);
162     }
163     ldap_value_free( val );
164 }
165 /* end of function: print_attr */
166
167 PUBLIC void form_attr(ld, fp, label, tattr, e, multiline, add_empty, glob)
168 LDAP *ld;
169 FILE *fp;
170 char *label;
171 char *tattr;
172 LDAPMessage *e;
173 int  multiline;
174 int  add_empty;
175 GLOB_STRUCT *glob;
176 {
177         char    **val, *s;
178         char    buffer[1024];
179         int     i, gotone = 0, line = 0;
180         static char *nlabel;
181         nlabel = ldap_friendly_name(glob->friendlyfile, label, &fm);
182         if ( (val = ldap_get_values( ld, e, tattr )) == NULL ) {
183         if (add_empty > 0)
184             if(multiline)
185                 fprintf( fp, "<DT><B>%s</B><DD><TEXTAREA NAME=\"%s=\" ROWS=4 COLS=30></TEXTAREA><BR>\n", 
186                                            nlabel, tattr);
187             else
188                         fprintf( fp, "<DT><B>%s</B><DD><INPUT NAME=\"%s=\" SIZE=30 ><BR>\n", 
189                                            nlabel, tattr);
190                 return;
191     }
192         fprintf( fp, "\n<DT><B>%s</B><DD>", nlabel );
193     buffer[0] ='\0';
194         for ( i = 0; val[i] != NULL; i++ ) {
195                 if ( multiline ) {
196                         char    *s, *p;
197                     buffer[0] ='\0';
198                         if ( gotone )
199                                 fprintf( fp, "<DT><B>%s</B><DD>", nlabel);
200                         p = s = val[i];
201                         while ( ( s = strchr( s, '$' )) ) {
202                                 *s++ = '\0';
203                                 while ( isspace( *s ) )
204                                         s++;
205                                 if ( line == 0 ) {
206                                         sprintf(buffer, "%s", p);
207                                         line++;
208                                 } else {
209                                         sprintf(buffer, "%s\n%s", buffer, p);
210                     line++;
211                                 }
212                                 p = s;
213                         }
214             if (line++ == 0) {
215                 sprintf(buffer, "%s", p);
216             } else {
217                 sprintf(buffer, "%s\n%s", buffer, p);
218             }
219             s = form_encode(buffer);
220                 fprintf( fp, 
221                 "<TEXTAREA NAME=\"%s=%s\" ROWS=%d COLS=30>%s</TEXTAREA><BR>\n", 
222                                  tattr, s, line + 1, s);
223                         /* fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=30,%d VALUE=\"%s\"> <BR>\n", tattr, s, line + 1, s); */
224                         gotone = 1;
225                         line = 0;
226                 } else {
227             s = form_encode(val[i]);
228                         fprintf( fp, "<INPUT NAME=\"%s=%s\" SIZE=\"%d\" VALUE=\"%s\"><BR>\n", tattr, s, 
229              strlen(val[i]) > 30 ? strlen(val[i]) + 3 : 30, s);
230                 }
231         }
232     if (add_empty > i)
233         fprintf( fp, "<INPUT NAME=\"%s=\" SIZE=30 ><BR>\n", tattr);
234         ldap_value_free( val );
235 }
236 /* end of function: form_attr */
237
238 PUBLIC void do_pict(ld, fp, dn, type, glob)
239 LDAP *ld;
240 FILE *fp;
241 char *dn;
242 int type;
243 GLOB_STRUCT *glob;
244 {
245     int        rc, i;
246     struct berval    **val;
247     char            cmd[128], buffer[1024];
248     char        *s;
249     FILE        *op, *tp;
250     LDAPMessage    *res, *e;
251     struct stat    st;
252         char            *cPtr, *ptype;
253     char            *tattr;
254
255     if ( (rc = ldap_search_s( ld, dn, LDAP_SCOPE_BASE, NULL,
256         NULL, 0, &res )) != LDAP_SUCCESS ) {
257         do_error(fp, rc, NOT_FOUND, glob);
258         return;
259     }
260
261     if ( (e = ldap_first_entry( ld, res )) == NULL ) {
262         do_error(fp, -2, SERVER_ERROR, glob);
263         return;
264     }
265
266         /*
267          *  old behaviour: use "photo" or "jpegPhoto" attribute
268          *  as indicated by type-argument.
269          */
270         tattr = (type == 0 ? "photo" : "jpegPhoto");
271
272         /* NEW: if attr is added to URL via "+" use that attribute */
273         if( ( cPtr = strQuoteChr(dn,'+')) )
274              tattr = ++cPtr;
275
276     if ( (val = ldap_get_values_len( ld, e, tattr)) == NULL )
277         return;
278
279     s  = tmpnam( NULL );
280     tp = fopen( s, "w+");
281
282     if (type == 0) {  /* g3fax photo -> xbm */
283         sprintf(cmd, "%s > %s", G3TOXBM, s);
284         if (debug) fprintf(stderr, "%ld bytes FAX!! %s\n", 
285                                      val[0]->bv_len, cmd);
286                 ptype = "x-xbitmap";
287     } else if (type == 1) {    /* jpeg -> gif */
288         sprintf(cmd, "%s > %s", JPEGTOGIF, s);
289         if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n", 
290                                      val[0]->bv_len, cmd);
291                 ptype = "gif";
292     } else {              /* jpeg direct */
293         sprintf(cmd, "cat > %s", s);
294         if (debug) fprintf(stderr, "%ld bytes JPEG!! %s\n", 
295                                      val[0]->bv_len, cmd);
296                 ptype = "jpeg";
297            }
298
299         
300         
301     if (http == 1) {
302         fprintf(fp, "HTTP/1.0 %d OK<br>MIME-Version: 1.0<br>", 
303                             DOCUMENT_FOLLOWS );
304         fprintf(fp, "Content-type: image/%s<br>", ptype );
305     }
306         if (request == HEAD) {                
307         fflush(fp);
308         exit_tweb (1);                                   
309         }                          
310     if ((op = popen(cmd, "w")) == NULL ) 
311          return;
312     fwrite(val[0]->bv_val, val[0]->bv_len, 1, op);
313     pclose(op);
314     if (stat(s, &st) == 0 && http == 1) {
315         fprintf(fp, "Content-length: %lu<br>", st.st_size);
316         if (debug) fprintf(stderr, "Image size: %lu\n", st.st_size);
317     }
318     fprintf(fp, "<br>\n\n");
319
320     while (( i = fread(buffer, 1, 1024, tp))) fwrite(buffer, 1, i, fp);
321     fclose(tp);
322     if (unlink(s) == -1) {
323         if (debug) perror("Couldn't unlink temp image file");
324     }
325     fflush(fp);
326 }
327 /* end of function: do_pict */
328
329
330
331 PUBLIC void do_audio(ld, fp, dn, type, glob)
332 LDAP *ld;
333 FILE *fp;
334 char *dn;
335 int type;
336 GLOB_STRUCT *glob;
337 {
338     int        rc;
339     struct berval    **val;
340     LDAPMessage    *res, *e;
341     struct timeval    timeout;
342
343     timeout.tv_sec = glob->timeout;
344     timeout.tv_usec = 0;
345     if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, NULL,
346         NULL, 0, &timeout, &res )) != LDAP_SUCCESS ) {
347         do_error(fp, rc, NOT_FOUND, glob);
348         return;
349     }
350
351     if ( (e = ldap_first_entry( ld, res )) == NULL ) {
352         do_error(fp, -2, SERVER_ERROR, glob);
353         return;
354     }
355     if ( (val = ldap_get_values_len( ld, e, "audio" )) == NULL )
356         return;
357     if (http == 1) {
358         fprintf(fp, "HTTP/1.0 %d OK\nMIME-Version: 1.0\nServer: %s\n", 
359                   DOCUMENT_FOLLOWS, version);
360         fprintf(fp, "Content-type:  audio/basic<P>Content-length: %ld\n\n", 
361                   val[0]->bv_len);
362     }
363         if (request == HEAD) {                
364         fflush(fp);
365         exit_tweb (1);                                   
366         }                          
367     fwrite(val[0]->bv_val, val[0]->bv_len, 1, fp);
368     fflush(fp);
369 }
370 /* end of function: do_audio */
371
372 PUBLIC void do_sizelimit(fp, type, glob)
373 FILE *fp;
374 int type;
375 GLOB_STRUCT *glob;
376
377 {
378     fprintf(fp, type ? glob->la[21] : glob->la[20]);
379 }
380 /* end of function: do_sizelimit */
381
382 PUBLIC void do_error(fp, code, status, glob)
383 FILE *fp;
384 int code;
385 int status;
386 GLOB_STRUCT *glob;
387 {
388     char *s = "";
389
390            if (http == 1) {
391         switch (status) {
392               case BAD_REQUEST:      s = "Bad request"; break;
393             case AUTH_REQUIRED:      s = "Authorization required"; break;
394             case FORBIDDEN:      s = "Forbidden"; break;
395             case NOT_FOUND:      s = "Not found"; break;
396             case SERVER_ERROR:      s = "Server error"; break;
397             case NOT_IMPLEMENTED: s = "Not implemented"; break;
398             default:          s = "Unknown error";
399         }
400
401         fprintf(fp, "HTTP/1.0 %03d %s\nMIME-Version: 1.0\nContent-Type: text/html\n\n", status, s);
402             }
403
404         if (request == HEAD) {
405         fflush(fp);
406                    exit_tweb (1);
407         }
408
409         fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]);
410         fprintf( fp, "\n<H2>%s %s</H2>\n%s <P>%s <EM> %d: %s.</EM><P>%s<br></BODY></HTML>", glob->la[23], s, glob->la[24], glob->la[25], code, ldap_err2string( code ), glob->la[26] );
411 }
412 /* end of function: do_error */
413
414 PUBLIC void explain_error (fp, error, status, glob )
415 FILE *fp;
416 char *error;
417 int status;
418 GLOB_STRUCT *glob;
419
420 {
421         char *s = "Unknown error";
422         if (http == 1) {    
423                 switch (status) {
424                 case BAD_REQUEST:       s = "Bad request"; break;
425                 case AUTH_REQUIRED:     s = "Authorization required"; break;
426                 case FORBIDDEN:         s = "Forbidden"; break;   
427                 case NOT_FOUND:         s = "Not found"; break;
428                 case SERVER_ERROR:      s = "Server error"; break;              
429                 case NOT_IMPLEMENTED:   s = "Not implemented"; break;
430                 default:                s = "Unknown error";                  
431                 }                                                    
432         fprintf(fp, "HTTP/1.0 %03d %s\n",status, s);
433                 fprintf(fp, "MIME-Version: 1.0\n");
434                 fprintf(fp, "Content-Type: text/html\n\n");
435         }                                           
436         if (request == HEAD) {                   
437         fflush(fp);
438                 exit_tweb (1);               
439         }
440         fprintf( fp, HTML_HEAD_TITLE, glob->la[22], glob->la[100]);
441     fprintf( fp, "<H2>%s: %s</H2>\n", glob->la[22], s);
442     fprintf( fp, "%s</BODY>\n</HTML>", error);
443 }    
444 /* end of function: explain_error */
445
446 /* Make "Move upwards" Header */
447 PUBLIC void make_header (fp, dn, action, glob)
448 FILE *fp;
449  char *dn;
450 int action;
451 GLOB_STRUCT *glob;
452 {
453     char **s, **t, hrdn[1024];
454     int  cnt, i, j;
455     pGW_SWITCH_LINE gw_ptr;
456     char url[BUFSIZ];
457
458     if(glob->pull_down_menus) {
459         make_header_pull_down(fp, dn, action, glob);
460         return;
461     }
462
463     hrdn[0] = '\0';
464     if ( strlen(dn) == 0)        /* the root */
465         return;
466     s = ldap_explode_dn( dn, 1 );
467     t = ldap_explode_dn( dn, 0 );
468
469     strcpy(url, "M");
470     for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
471         if (!strcasecmp(gw_ptr->dn, "ROOT"))
472             strcpy(url, gw_ptr->url);
473
474     fprintf( fp, "<strong>%s </strong><MENU>\n<LI> <A HREF=\"%s\">%s</A>\n",
475         glob->la[27], url, glob->la[77]);
476
477
478     for (cnt=0; t[cnt]; cnt++);
479     for (i = cnt - 1; i > 0 && s[i]; i--) {
480         strcpy(hrdn, hex_encode(t[i]));
481         for (j = i + 1; j < cnt ; j++) {
482             strcat(hrdn, hex_encode(", "));
483             strcat(hrdn,hex_encode(t[j]));
484         }
485         
486         strcpy(url, "/");
487         for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
488             if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn))
489                 strcpy(url, url_complete(gw_ptr->url, hrdn, "M"));
490         if(strcmp(url, "/"))
491             fprintf( fp, "<LI> <A HREF=\"%s\">%s</A>\n",
492                          url, i == cnt - 1 ? 
493                          ldap_friendly_name( glob->friendlyfile, s[i], &fm ) : 
494                          s[i]);
495         else
496             fprintf( fp, "<LI> <A HREF=\"%sM%s\">%s</A>\n",
497                          url, hrdn, i == cnt - 1 ?
498                          ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :
499                          s[i]);
500             hrdn[0] = '\0';
501     }
502     fprintf( fp, "</MENU>\n");
503     ldap_value_free(s);
504     ldap_value_free(t);
505 }
506 /* end of function: make_header */
507
508 /* Make "Move upwards" Header with pull-down-menus*/
509 PUBLIC void make_header_pull_down (fp, dn, action, glob)
510 FILE *fp;
511  char *dn;
512 int action;
513 GLOB_STRUCT *glob;
514 {
515     char **s, **t, hrdn[1024];
516     int  cnt, i, j;
517     pGW_SWITCH_LINE gw_ptr;
518     char url[BUFSIZ];
519
520     hrdn[0] = '\0';
521     if ( strlen(dn) == 0)        /* the root */
522         return;
523     s = ldap_explode_dn( dn, 1 );
524     t = ldap_explode_dn( dn, 0 );
525
526     strcpy(url, "M");
527     for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
528         if (!strcasecmp(gw_ptr->dn, "ROOT"))
529             strcpy(url, gw_ptr->url);
530
531     fprintf( fp, "<FORM ACTION=\"/D\">\n");
532     fprintf( fp, 
533        "<INPUT TYPE=submit VALUE=\"%s\"> -&gt; <SELECT NAME=\"H\">\n",
534                                    glob->la[27]);
535     fprintf( fp, "<OPTION VALUE=\"%s\">%s\n", url, glob->la[77]);
536
537     for (cnt=0; t[cnt]; cnt++);
538     for (i = cnt - 1; i > 0 && s[i]; i--) {
539         strcpy(hrdn, hex_encode(t[i]));
540         for (j = i + 1; j < cnt ; j++) {
541             strcat(hrdn, hex_encode(", "));
542             strcat(hrdn,hex_encode(t[j]));
543         }
544         
545         strcpy(url, "/");
546         for(gw_ptr = glob->gw_switch->list; gw_ptr; gw_ptr = gw_ptr->next)
547             if (!dn_cmp(hex_encode (gw_ptr->dn), hrdn))
548                 strcpy(url, url_complete(gw_ptr->url, hrdn, "M"));
549         if(strcmp(url, "/"))
550             fprintf( fp, "<OPTION VALUE=\"%s\" %s>%s\n", url,
551                                 i==1 ? "SELECTED" : "", i == cnt - 1 ?
552                      ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]);
553         else
554             fprintf( fp, "<OPTION VALUE=\"%sM%s\" %s>%s\n",
555                      url, hrdn, i==1 ? "SELECTED" : "", i == cnt - 1 ? 
556                      ldap_friendly_name( glob->friendlyfile, s[i], &fm ) :s[i]);
557             hrdn[0] = '\0';
558     }
559     fprintf( fp, "</SELECT></FORM>\n");
560
561     ldap_value_free(s);
562     ldap_value_free(t);
563 }
564 /* end of function: make_header_pull_down */
565
566 PUBLIC char * url_complete (gwp_url, rdn, separator)
567 char *gwp_url, *rdn, *separator;
568 {
569     static char url[BUFSIZ];
570     char *strptr;
571
572     strcpy(url, gwp_url);
573
574     if(!strchr (gwp_url, '=')) {
575
576         if (!strncasecmp (url, "http://", 7)) {
577
578             if ( ( strptr = strchr (url+7, '/')) ) *(++strptr) = '\0';
579             else strcat (url, "/");
580
581         } else *url = '\0';
582
583         sprintf (url, "%s%s%s", url, separator, rdn);
584
585     }
586
587     return(url);
588
589 }
590 /* end of function: url_complete */
591
592 PRIVATE void photof(fp, flag, imageChar, dn, tattr)
593 FILE *fp;
594 int  flag;
595 char    imageChar;
596 char *dn;
597 char *tattr;
598 {
599     switch(flag) {
600         case BMP     : imageChar = 'G'; break;
601         case JPEG2GIF: imageChar = 'I'; break;
602         case JPEG    : imageChar = 'J'; break;
603     }
604     fprintf( fp, "<IMG ALT=\"Photo\" SRC=\"%c%s\"+%s>\n",
605                imageChar, hex_encode(dn), tattr);
606 }
607 /* end of function: photof */
608
609 PRIVATE void urlf(fp, vali)
610 FILE *fp;
611 char *vali;
612 {
613     char *cp;
614
615     if ((cp = strchr(vali, '$')) != NULL) {
616         *cp++ = '\0';
617         fprintf( fp, "%s%c\n", vali,
618            (vali[0] ? ':' : ' '));
619         fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n",
620              cp, cp);
621     } else
622         fprintf( fp, "%s<BR>\n", vali);
623 }
624 /* end of function: urlf */
625
626 PRIVATE void dynamicdnf(fp, vali, glob)
627 FILE *fp;
628 char *vali;
629 GLOB_STRUCT *glob;
630 {
631     fprintf(fp," <A HREF=\"%s/M%s\"> %s</A><BR>\n",
632
633 #ifdef TUE_TEL
634                dn2server(vali, glob),
635 #else
636                "",
637 #endif
638
639                vali, vali);
640 }
641 /* end of function: dynamicdnf */
642
643 /* Allow href dn-lable flexible configuration via INDEXURL */
644 PRIVATE void indexurlf(fp, vali, entrydn, glob)
645 FILE *fp;
646 char *vali;
647 char *entrydn;
648 GLOB_STRUCT *glob;
649 {
650     char *cp;
651     char dnbuf[BUFSIZ], *strptr, **dn;
652     char rulebuf[BUFSIZ], *disp_item;
653     int arrsize, first;
654     char entrydnbuf[BUFSIZ], dit_dnbuf[BUFSIZ];
655     int index;
656
657     if (((cp = strchr(vali, ' ')) != NULL) && glob->index_url) {
658
659         *cp++ = '\0';
660         index = atoi(cp);
661
662         if ( index < 0 || index >= INDEX_RULE_SIZE )
663             return;
664         if (!glob->index_url->rarr[index].rule) {
665             return;
666         }
667
668         /* case entrydn out of range */
669         strcpy(entrydnbuf, entrydn);
670         strcpy(dit_dnbuf, glob->index_url->rarr[index].dit_dn);
671         dn_normalize(entrydnbuf);
672         dn_normalize(dit_dnbuf);
673         if(!dn_issuffix(entrydnbuf, dit_dnbuf)){
674             fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp);
675             return;
676         }
677
678         /* return if url doesn't contain cn= ( no dn ) */
679         if(!(strptr = strstr(vali, "cn=")))
680             return;
681         strcpy(dnbuf, strptr);
682         hex_decode(dnbuf);
683         dn = ldap_explode_dn(dnbuf, 1);
684
685         for(arrsize=0; dn[arrsize]; arrsize++)
686             ;
687
688         if(arrsize && glob->strip_pin)
689             trimright(dn[0], " 1234567890");
690
691         fprintf(fp," <A HREF=\"%s\">", vali);
692         strcpy(rulebuf, glob->index_url->rarr[index].rule);
693         first = 1;
694
695         for(disp_item = strtok(rulebuf, ","); disp_item;
696                                               disp_item = strtok(NULL, ",")) {
697             if(abs(atoi(disp_item)) >= arrsize) continue;
698
699             if(*disp_item == '-') {
700                 fprintf(fp,"%s%s", !first ? ", " : "",
701                                    dn[arrsize + atoi(disp_item) - 1]);
702             } else {
703                 fprintf(fp,"%s%s", !first ? ", " : "", dn[atoi(disp_item)]);
704             }
705             first = 0;
706         }
707
708         fprintf(fp,"</A><BR>\n");
709     } else
710         fprintf( fp, "%s<BR>\n", vali);
711 }
712 /* end of function: indexurlf */
713
714 PRIVATE void urif(fp, vali, glob)
715 FILE *fp;
716 char *vali;
717 GLOB_STRUCT *glob;
718 {
719     char *cp;
720
721     if(glob->gw_switch->dynamic && strstr(vali, "(gw"))
722         return;
723     if ((cp = strchr(vali, ' ')) != NULL) {
724         *cp++ = '\0';
725         fprintf(fp," <A HREF=\"%s\"> %s</A><BR>\n", vali, cp);
726     } else
727         fprintf( fp, "%s<BR>\n", vali);
728 }
729 /* end of function: urif */
730
731 /* function for ldap-referrals etc. */
732 PRIVATE void referralf(fp, vali, glob)
733 FILE *fp;
734 char *vali;
735 GLOB_STRUCT *glob;
736 {
737     char *cp;
738
739     if(glob->gw_switch->dynamic && strstr(vali, "(gw"))
740         return;
741     if ((cp = strchr(vali, ' ')) != NULL) {
742         *cp++ = '\0';
743         fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n",
744                 glob->hostname, glob->webport, vali, cp);
745     } else
746         fprintf(fp," <A HREF=\"http://%s:%d/W%s\"> %s</A><BR>\n",
747                 glob->hostname, glob->webport, vali, vali);
748 }
749 /* end of function: referralf */
750
751 PRIVATE void pgpkeyf(fp, vali, firstline)
752 FILE *fp;
753 char *vali;
754 int *firstline;
755 {
756     char    *s, *p;
757
758     fprintf( fp, "<TT>\n");
759     p = s = vali;
760     while ( ( s = strstr( s, " $" )) ) {
761         *s++ = '\0';   /*  delete BLANK  */
762         *s++ = '\0';   /*  delete DOLLAR */
763         while ( isspace( *s ) )
764             s++;
765         if ( *firstline == TRUE ) {
766             fprintf( fp, "<DT>%s<BR>\n", p );
767             *firstline = FALSE;
768         } else if (!strncasecmp(p, "Version", 7)) {
769             fprintf( fp, "%s<BR><BR>\n", p );
770         } else {
771             fprintf( fp, "%s<BR>\n", p );
772         }
773         p = s;
774     }
775     if ( *firstline == TRUE ) {
776         fprintf( fp,"<DT>%s<BR>", p );
777         *firstline = FALSE;
778     } else {
779         fprintf( fp, "%s\n", p );
780     }
781     fprintf( fp, "</TT>\n");
782 }
783 /* end of function: pgpkeyf */
784
785 PRIVATE void multilinef(fp, vali, first_of_same, firstline, gotone, nlabel)
786 FILE *fp;
787 char *vali;
788 int *first_of_same;
789 int *firstline;
790 int *gotone;
791 char *nlabel;
792 {
793     char    *s, *p;
794
795     if ( !*first_of_same && *gotone)
796         fprintf( fp, "<BR>");
797     if ( *gotone && *first_of_same)
798         fprintf( fp, "<DT><B>%s</B><DD>", nlabel);
799     else if (!*first_of_same)
800         fprintf( fp, "<BR>");
801     p = s = vali;
802
803     /*  PATCH to process MULTILINE correctly:
804         replace  strstr() instead of strchr(), in order not to missinterpret 
805         DOLLAR in Text ; /KSp, 95/06/28
806     */
807
808     /*
809     while ( s = strchr( s, '$' ) ) {
810     */
811     while ( ( s = strstr( s, " $" )) ) {
812         *s++ = '\0';   /*  delete BLANK  */
813         *s++ = '\0';   /*  delete DOLLAR */
814         while ( isspace( *s ) )
815             s++;
816
817         /*
818         if (dosyslog)
819             syslog (LOG_INFO, "multiLineAttr: %s", p);
820         */
821
822         fprintf( fp, "%s<BR>\n", p );
823         if ( *firstline == TRUE )
824             *firstline = FALSE;
825         p = s;
826     }
827     if ( *firstline ) {
828         fprintf( fp, "%s<BR>\n", p );
829     } else {
830         fprintf( fp, "%s", p );
831     }
832     *gotone = 1;
833     *firstline = FALSE;
834     *first_of_same = FALSE;
835 }
836 /* end of function: multilinef */
837
838 PRIVATE void booleanf(fp, val_i, glob)
839 FILE *fp;
840 char *val_i;
841 GLOB_STRUCT *glob;
842 {
843     if (!strcmp(val_i, "TRUE")) fprintf( fp, "%s<BR>\n", glob->la[78]);
844     else fprintf( fp, "%s<BR>\n", glob->la[79]);
845 }
846 /* end of function: booleanf */
847
848 PRIVATE void datef(fp, val_i)
849 FILE *fp;
850 char **val_i;
851 {
852     fprintf( fp, "%s<BR>\n", format_date(&val_i, "%A, %d-%h-%y %T GMT"));
853 }
854 /* end of function: datef */
855
856 PRIVATE void mailtof(fp, val_i, vali)
857 FILE *fp;
858 char *val_i;
859 char *vali;
860 {
861    fprintf (fp, "<A HREF=\"mailto:%s\">%s</A><BR>\n", val_i, vali);
862 }
863 /* end of function: mailtof */
864
865 PRIVATE void hreff(fp, val_i, vali, glob)
866 FILE *fp;
867 char *val_i;
868 char *vali;
869 GLOB_STRUCT *glob;
870 {
871     char    *ufn;
872     char    op = 'R';
873
874     ufn = friendly_dn( val_i, glob );
875     fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op,
876         hex_encode(val_i), ufn ? ufn : vali);
877     if ( ufn ) {
878         free( ufn );
879     }
880 }
881 /* end of function: hreff */
882
883 PRIVATE void movetof(fp, val_i, vali, glob)
884 FILE *fp;
885 char *val_i;
886 char *vali;
887 GLOB_STRUCT *glob;
888 {
889     char    *ufn;
890     char     op = 'M';
891
892     ufn = friendly_dn( val_i, glob );
893     fprintf( fp, "<A HREF=\"/%c%s\">%s</A><BR>\n", op,
894         hex_encode(val_i), ufn ? ufn : vali);
895     if ( ufn ) {
896         free( ufn );
897     }
898 }
899 /* end of function: movetof */
900
901
902 PRIVATE void headerf(fp, vali, firstline)
903 FILE *fp;
904 char *vali;
905 int *firstline;
906 {
907     fprintf( fp, "<DT>");
908     fprintf( fp, "<H1>");
909     fprintf( fp,"%s", vali );
910     fprintf( fp, "</H1>\n");
911 }
912 /* end of function: headerf */
913
914 PRIVATE void pref(fp, vali, firstline)
915 FILE *fp;
916 char *vali;
917 int *firstline;
918 {
919     fprintf( fp, "<DT>");
920     fprintf( fp, "<PRE>");
921     fprintf( fp,"%s", vali );
922     fprintf( fp, "</PRE>\n");
923 }
924 /* end of function: pref */
925
926 PRIVATE void defaultf(fp, vali, firstline)
927 FILE *fp;
928 char *vali;
929 int *firstline;
930 {
931     if ( *firstline == TRUE ) {
932         fprintf( fp,"%s", vali );
933         *firstline = FALSE;
934     } else {
935         fprintf( fp, "<BR>\n%s", vali );
936     }
937 }
938 /* end of function: defaultf */
939