1/* sasldblistusers.c -- list users in sasldb
2 * $Id: sasldblistusers.c,v 1.24 2011/09/01 14:12:18 mel Exp $
3 * Rob Siemborski
4 * Tim Martin
5 */
6/*
7 * Copyright (c) 1998-2003 Carnegie Mellon University.  All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in
18 *    the documentation and/or other materials provided with the
19 *    distribution.
20 *
21 * 3. The name "Carnegie Mellon University" must not be used to
22 *    endorse or promote products derived from this software without
23 *    prior written permission. For permission or any other legal
24 *    details, please contact
25 *      Office of Technology Transfer
26 *      Carnegie Mellon University
27 *      5000 Forbes Avenue
28 *      Pittsburgh, PA  15213-3890
29 *      (412) 268-4387, fax: (412) 268-7395
30 *      tech-transfer@andrew.cmu.edu
31 *
32 * 4. Redistributions of any form whatsoever must retain the following
33 *    acknowledgment:
34 *    "This product includes software developed by Computing Services
35 *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
36 *
37 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
38 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
39 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
40 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
41 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
42 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
43 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
44 */
45
46#include <config.h>
47
48#include <stdio.h>
49#include <stdlib.h>
50
51#ifdef HAVE_UNISTD_H
52#include <unistd.h>
53#endif
54
55#include <sasl.h>
56#include "../sasldb/sasldb.h"
57
58#ifdef WIN32
59#include <saslutil.h>
60__declspec(dllimport) char *optarg;
61__declspec(dllimport) int optind;
62#endif
63
64/* Cheating to make the utils work out right */
65LIBSASL_VAR const sasl_utils_t *sasl_global_utils;
66
67char *sasldb_path = SASL_DB_PATH;
68const char *progname = NULL;
69
70int good_getopt(void *context __attribute__((unused)),
71		const char *plugin_name __attribute__((unused)),
72		const char *option,
73		const char **result,
74		unsigned *len)
75{
76    if (sasldb_path && !strcmp(option, "sasldb_path")) {
77	*result = sasldb_path;
78	if (len)
79	    *len = (unsigned) strlen(sasldb_path);
80	return SASL_OK;
81    }
82
83    return SASL_FAIL;
84}
85
86static struct sasl_callback goodsasl_cb[] = {
87    { SASL_CB_GETOPT, (sasl_callback_ft)&good_getopt, NULL },
88    { SASL_CB_LIST_END, NULL, NULL }
89};
90
91int main(int argc, char **argv)
92{
93    int c;
94    int result;
95    sasl_conn_t *conn;
96    int bad_option = 0;
97    int display_usage = 0;
98    const char *sasl_implementation;
99    int libsasl_version;
100    int libsasl_major;
101    int libsasl_minor;
102    int libsasl_step;
103
104    if (! argv[0])
105       progname = "sasldblistusers2";
106    else {
107       progname = strrchr(argv[0], HIER_DELIMITER);
108       if (progname)
109           progname++;
110       else
111           progname = argv[0];
112    }
113
114    /* A single parameter not starting with "-" denotes sasldb to use */
115    if ((argc == 2) && argv[1][0] != '-') {
116	sasldb_path = argv[1];
117	goto START_WORK;
118    }
119
120    while ((c = getopt(argc, argv, "vf:h?")) != EOF) {
121       switch (c) {
122         case 'f':
123	   sasldb_path = optarg;
124	   break;
125         case 'h':
126           bad_option = 0;
127            display_usage = 1;
128           break;
129	 case 'v':
130	   sasl_version (&sasl_implementation, &libsasl_version);
131	   libsasl_major = libsasl_version >> 24;
132	   libsasl_minor = (libsasl_version >> 16) & 0xFF;
133	   libsasl_step = libsasl_version & 0xFFFF;
134
135	   (void)fprintf(stderr, "\nThis product includes software developed by Computing Services\n"
136		"at Carnegie Mellon University (http://www.cmu.edu/computing/).\n\n"
137		"Built against SASL API version %u.%u.%u\n"
138		"LibSasl version %u.%u.%u by \"%s\"\n",
139		SASL_VERSION_MAJOR, SASL_VERSION_MINOR, SASL_VERSION_STEP,
140		libsasl_major, libsasl_minor, libsasl_step, sasl_implementation);
141	   exit(0);
142	   break;
143
144         default:
145           bad_option = 1;
146            display_usage = 1;
147            break;
148       }
149    }
150
151    if (optind != argc)
152       display_usage = 1;
153
154    if (display_usage) {
155           fprintf(stderr,
156             "\nThis product includes software developed by Computing Services\n"
157             "at Carnegie Mellon University (http://www.cmu.edu/computing/).\n\n");
158
159           fprintf(stderr, "%s: usage: %s [-v] [[-f] sasldb]\n",
160		   progname, progname);
161           fprintf(stderr, "\t-f sasldb\tuse given file as sasldb\n"
162                           "\t-v\tprint version numbers and exit\n");
163       if (bad_option) {
164           fprintf(stderr, "Unrecognized command line option\n");
165       }
166       return 1;
167    }
168
169START_WORK:
170    result = sasl_server_init(goodsasl_cb, "sasldblistusers");
171    if(result != SASL_OK) {
172	fprintf(stderr, "Couldn't initialize server API\n");
173	return 1;
174    }
175
176    result = sasl_server_new("sasldb",
177			     "localhost",
178			     NULL,
179			     NULL,
180			     NULL,
181			     NULL,
182			     0,
183			     &conn);
184
185    if(_sasl_check_db(sasl_global_utils, conn) != SASL_OK) {
186	fprintf(stderr, "check_db unsuccessful\n");
187	return 1;
188    }
189
190    if(_sasldb_listusers (sasl_global_utils, conn, NULL, NULL) != SASL_OK) {
191	fprintf(stderr, "listusers failed\n");
192    }
193
194    sasl_dispose(&conn);
195    sasl_done();
196
197    return 0;
198}
199