Add.
[gsasl.git] / examples / client-callback.c
blob8d38a4f9e2f25c935862e852c595ec21626b4745
1 /* client-callback.c --- Example SASL client, with callback for user info.
2 * Copyright (C) 2004, 2005, 2007 Simon Josefsson
4 * This file is part of GNU SASL.
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include <stdarg.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
26 #include <gsasl.h>
28 static void
29 client_authenticate (Gsasl * ctx, Gsasl_session * session)
31 char buf[BUFSIZ] = "";
32 char *p;
33 int rc;
35 /* This loop mimic a protocol where the server get to send data first. */
39 printf ("Input base64 encoded data from server:\n");
40 fgets (buf, sizeof (buf) - 1, stdin);
41 if (buf[strlen (buf) - 1] == '\n')
42 buf[strlen (buf) - 1] = '\0';
44 rc = gsasl_step64 (session, buf, &p);
46 if (rc == GSASL_NEEDS_MORE || rc == GSASL_OK)
48 printf ("Output:\n%s\n", p);
49 free (p);
52 while (rc == GSASL_NEEDS_MORE);
54 printf ("\n");
56 if (rc != GSASL_OK)
58 printf ("Authentication error (%d): %s\n", rc, gsasl_strerror (rc));
59 return;
62 /* The client is done. Here you would typically check if the server
63 let the client in. If not, you could try again. */
65 printf ("If server accepted us, we're done.\n");
68 static void
69 client (Gsasl * ctx)
71 Gsasl_session *session;
72 const char *mech = "SECURID";
73 int rc;
75 /* Create new authentication session. */
76 if ((rc = gsasl_client_start (ctx, mech, &session)) != GSASL_OK)
78 printf ("Cannot initialize client (%d): %s\n", rc, gsasl_strerror (rc));
79 return;
82 /* Do it. */
83 client_authenticate (ctx, session);
85 /* Cleanup. */
86 gsasl_finish (session);
89 static int
90 callback (Gsasl * ctx, Gsasl_session * sctx, Gsasl_property prop)
92 char buf[BUFSIZ] = "";
93 int rc = GSASL_NO_CALLBACK;
95 /* Get user info from user. */
97 printf ("Callback invoked, for property %d.\n", prop);
99 switch (prop)
101 case GSASL_PASSCODE:
102 printf ("Enter passcode:\n");
103 fgets (buf, sizeof (buf) - 1, stdin);
104 buf[strlen (buf) - 1] = '\0';
106 gsasl_property_set (sctx, GSASL_PASSCODE, buf);
107 rc = GSASL_OK;
108 break;
110 case GSASL_AUTHID:
111 printf ("Enter username:\n");
112 fgets (buf, sizeof (buf) - 1, stdin);
113 buf[strlen (buf) - 1] = '\0';
115 gsasl_property_set (sctx, GSASL_AUTHID, buf);
116 rc = GSASL_OK;
117 break;
119 default:
120 printf ("Unknown property! Don't worry.\n");
121 break;
124 return rc;
128 main (int argc, char *argv[])
130 Gsasl *ctx = NULL;
131 int rc;
133 /* Initialize library. */
134 if ((rc = gsasl_init (&ctx)) != GSASL_OK)
136 printf ("Cannot initialize libgsasl (%d): %s", rc, gsasl_strerror (rc));
137 return 1;
140 /* Set the callback handler for the library. */
141 gsasl_callback_set (ctx, callback);
143 /* Do it. */
144 client (ctx);
146 /* Cleanup. */
147 gsasl_done (ctx);
149 return 0;