]> git.sur5r.net Git - openldap/blob - libraries/liblutil/sasl.c
65a3ef821a52712d5965d13287765a8f03fc1bae
[openldap] / libraries / liblutil / sasl.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 2000 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6
7 #include "portable.h"
8
9 #ifdef HAVE_CYRUS_SASL
10
11 #include <stdio.h>
12 #include <ac/stdlib.h>
13 #include <ac/string.h>
14 #include <ac/unistd.h>
15
16 #include <sasl.h>
17
18 #include <ldap.h>
19 #include "lutil_ldap.h"
20
21 static int interaction(
22         sasl_interact_t *interact )
23 {
24         char input[1024];
25
26         int noecho=0;
27         int challenge=0;
28
29         switch( interact->id ) {
30         case SASL_CB_NOECHOPROMPT:
31                 noecho = 1;
32                 challenge = 1;
33                 break;
34         case SASL_CB_ECHOPROMPT:
35                 challenge = 1;
36                 break;
37         case SASL_CB_PASS:
38                 noecho = 1;
39                 break;
40         }
41
42         if( challenge ) {
43                 if( interact->challenge ) {
44                         fprintf( stderr, "Challenge: %s\n", interact->challenge );
45                 }
46                 if( interact->defresult ) {
47                         fprintf( stderr, "Default Result: %s\n", interact->defresult );
48                 }
49         }
50
51         sprintf( input, "%s: ",
52                 interact->prompt ? interact->prompt : "Interaction required" );
53
54         if( noecho ) {
55                 interact->result = (char *) getpassphrase( input );
56                 interact->len = interact->result
57                         ? strlen( interact->result ) : 0;
58
59         } else {
60                 /* prompt user */
61                 fputs( input, stderr );
62
63                 /* get input */
64                 interact->result = fgets( input, sizeof(input), stdin );
65
66                 if( interact->result == NULL ) {
67                         interact->len = 0;
68                         return LDAP_UNAVAILABLE;
69                 }
70
71                 /* len of input */
72                 interact->len = strlen(input); 
73
74                 if( interact->len > 0 && input[interact->len - 1] == '\n' ) {
75                         /* input includes '\n', trim it */
76                         interact->len--;
77                         input[interact->len] = '\0';
78                 }
79         }
80
81
82         if( interact->len > 0 ) {
83                 /* duplicate */
84                 char *p = interact->result;
85                 interact->result = strdup( p );
86
87                 /* zap */
88                 memset( p, '\0', interact->len );
89
90         } else {
91                 /* must be empty */
92                 interact->result = strdup("");
93         }
94
95         return LDAP_SUCCESS;
96 }
97
98 int lutil_sasl_interact(
99         LDAP *ld,
100         void *in )
101 {
102         sasl_interact_t *interact = in;
103
104         while( interact->id != SASL_CB_LIST_END ) {
105                 int rc = interaction( interact );
106
107                 if( rc )  return rc;
108                 interact++;
109         }
110         
111         return LDAP_SUCCESS;
112 }
113
114 #endif