Added pwmc.1.
[pwmd.git] / libpwmd / exampleclient.c
blobabb15ca7c0405c7c638eaa5a99b9e70c3f12fb02
1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
2 /*
3 Copyright (C) 2006-2007 Ben Kibbey <bjk@luxsci.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <unistd.h>
22 #include <err.h>
23 #include <errno.h>
24 #include <pwd.h>
25 #include <string.h>
26 #include <limits.h>
27 #include <fcntl.h>
28 #include <libpwmd.h>
30 int main(int argc, char *argv[])
32 pwm_t *pwm;
33 int error;
34 int ret;
35 int opt;
36 char *socketpath = NULL;
37 int noagent = 1;
38 char buf[LINE_MAX], *b64;
39 size_t len;
40 char *result, *p, *l;
42 while ((opt = getopt(argc, argv, "hs:a")) != EOF) {
43 switch (opt) {
44 case 'a':
45 noagent = 0;
46 break;
47 case 's':
48 socketpath = optarg;
49 break;
50 case 'h':
51 default:
52 fprintf(stderr, "Usage: %s [-h] [-a] [-s <socketpath>]\n"
53 " -a use gpg-agent\n"
54 " -s specify an alternate socket path\n"
55 " -h this help text\n", argv[0]);
56 exit(EXIT_SUCCESS);
60 fprintf(stderr, "Connecting to socket...\n");
61 if ((pwm = pwmd_connect(socketpath, &error)) == NULL)
62 errx(EXIT_FAILURE, "pwmd_connect(): %s", strerror(error));
64 fprintf(stderr, "Connected. fd=%i\n", pwm->fd);
66 if (noagent) {
67 fprintf(stderr, "Setting password 'test'...\n");
69 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
70 PWMD_OPTION_PASSWORD, "test")) != PWMD_OK) {
71 pwmd_close(pwm);
73 if (ret == PWMD_ERROR)
74 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
75 else
76 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
79 else {
80 fprintf(stderr, "Setting PWMD_OPTION_USEAGENT...\n");
81 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
82 PWMD_OPTION_USEAGENT, 1)) != PWMD_OK) {
83 pwmd_close(pwm);
85 if (ret == PWMD_ERROR)
86 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
87 else
88 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
91 fprintf(stderr, "Setting PWMD_OPTION_TITLE...\n");
92 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
93 PWMD_OPTION_TITLE, "PWMD Client Test")) != PWMD_OK) {
94 pwmd_close(pwm);
96 if (ret == PWMD_ERROR)
97 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
98 else
99 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
102 fprintf(stderr, "Setting PWMD_OPTION_PROMPT...\n");
103 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
104 PWMD_OPTION_PROMPT, "Password please:")) != PWMD_OK) {
105 pwmd_close(pwm);
107 if (ret == PWMD_ERROR)
108 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
109 else
110 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
113 fprintf(stderr, "Setting PWMD_OPTION_DESC...\n");
114 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
115 PWMD_OPTION_DESC, "Enter the password for file \"testfile\".")) != PWMD_OK) {
116 pwmd_close(pwm);
118 if (ret == PWMD_ERROR)
119 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
120 else
121 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
125 fprintf(stderr, "Opening 'testfile'...\n");
126 if ((ret = pwmd_command(pwm, &result, &error, PWMD_OPEN, "testfile")) != PWMD_OK) {
127 pwmd_close(pwm);
129 if (ret == PWMD_ERROR)
130 errx(EXIT_FAILURE, "PWMD_OPEN: %s", strerror(error));
131 else if (ret == PWMD_PERROR)
132 errx(EXIT_FAILURE, "PWMD_OPEN: %s", pwmd_strerror(error));
133 else
134 errx(EXIT_FAILURE, "PWMD_OPEN: gpg-agent failed. Is GPG_AGENT_INFO set?");
137 fprintf(stderr, "File opened. Creating 'newaccount' and test element...\n");
138 b64 = pwmd_base64_encode("somehost.com", 12);
139 snprintf(buf, sizeof(buf), "STORE newaccount\tsmtp\thostname\t%s\n", b64);
140 free(b64);
142 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
143 pwmd_close(pwm);
145 if (ret == PWMD_ERROR)
146 errx(EXIT_FAILURE, "STORE: %s", strerror(error));
147 else
148 errx(EXIT_FAILURE, "STORE: %s", pwmd_strerror(error));
151 fprintf(stderr, "OK. Testing invalid command syntax...\n");
152 snprintf(buf, sizeof(buf), "GET newaccount\tnop\n");
154 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
155 if (ret == PWMD_ERROR) {
156 pwmd_close(pwm);
157 errx(EXIT_FAILURE, "GET: %s", strerror(error));
159 else
160 fprintf(stderr, "OK, the error was: %s\n", pwmd_strerror(error));
163 fprintf(stderr, "OK. Creating another element...\n");
164 b64 = pwmd_base64_encode("25", 2);
165 snprintf(buf, sizeof(buf), "STORE newaccount\tsmtp\tport\t%s\n", b64);
166 free(b64);
167 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
168 pwmd_close(pwm);
170 if (ret == PWMD_ERROR)
171 errx(EXIT_FAILURE, "STORE: %s", strerror(error));
172 else
173 errx(EXIT_FAILURE, "STORE: %s", pwmd_strerror(error));
176 fprintf(stderr, "OK. Testing LIST for account list...\n");
177 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, "LIST\n")) != PWMD_OK) {
178 pwmd_close(pwm);
180 if (ret == PWMD_ERROR)
181 errx(EXIT_FAILURE, "LIST: %s", strerror(error));
182 else
183 errx(EXIT_FAILURE, "LIST: %s", pwmd_strerror(error));
186 l = result;
188 while ((p = strsep(&result, "\n")))
189 fprintf(stderr, "%s\n", p);
191 free(l);
193 fprintf(stderr, "OK. Testing LIST for specific account 'newaccount'...\n");
194 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, "LIST newaccount\n")) != PWMD_OK) {
195 pwmd_close(pwm);
197 if (ret == PWMD_ERROR)
198 errx(EXIT_FAILURE, "LIST: %s", strerror(error));
199 else
200 errx(EXIT_FAILURE, "LIST: %s", pwmd_strerror(error));
203 l = result;
205 while ((p = strsep(&result, "\n")))
206 fprintf(stderr, "%s\n", p);
208 free(l);
209 fprintf(stderr, "OK. GET'ing a single element from 'newaccount'...\n");
210 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND,
211 "GET newaccount\tsmtp\thostname\n")) != PWMD_OK) {
212 pwmd_close(pwm);
214 if (ret == PWMD_ERROR)
215 errx(EXIT_FAILURE, "GET: %s", strerror(error));
216 else
217 errx(EXIT_FAILURE, "GET: %s", pwmd_strerror(error));
220 b64 = (char *)pwmd_base64_decode(result, &len);
221 fprintf(stderr, "%s (decoded: '", result);
222 fwrite(b64, 1, len, stderr);
223 fprintf(stderr, "')\n");
224 free(b64);
226 snprintf(buf, sizeof(buf), "ATTR SET name newaccount namechange\n");
227 fprintf(stderr, "OK. Changing account 'newaccount' to 'namechange'...\n");
228 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
229 pwmd_close(pwm);
231 if (ret == PWMD_ERROR)
232 errx(EXIT_FAILURE, "ATTR: %s", strerror(error));
233 else
234 errx(EXIT_FAILURE, "ATTR: %s", pwmd_strerror(error));
237 fprintf(stderr, "OK. see!\n");
238 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, "LIST\n")) != PWMD_OK) {
239 pwmd_close(pwm);
241 if (ret == PWMD_ERROR)
242 errx(EXIT_FAILURE, "LIST: %s", strerror(error));
243 else
244 errx(EXIT_FAILURE, "LIST: %s", pwmd_strerror(error));
247 l = result;
249 while ((p = strsep(&result, "\n")))
250 fprintf(stderr, "%s\n", p);
252 free(l);
254 fprintf(stderr, "No really!\n");
255 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, "LIST namechange\n")) != PWMD_OK) {
256 pwmd_close(pwm);
258 if (ret == PWMD_ERROR)
259 errx(EXIT_FAILURE, "LIST: %s", strerror(error));
260 else
261 errx(EXIT_FAILURE, "LIST: %s", pwmd_strerror(error));
264 l = result;
266 while ((p = strsep(&result, "\n")))
267 fprintf(stderr, "%s\n", p);
269 free(l);
270 fprintf(stderr, "OK. New pop3 tree (STORE)...\n");
271 b64 = pwmd_base64_encode("pophost.com", 11);
272 snprintf(buf, sizeof(buf), "STORE namechange\tpop3\thostname\t%s\n", b64);
273 free(b64);
274 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
275 pwmd_close(pwm);
277 if (ret == PWMD_ERROR)
278 errx(EXIT_FAILURE, "STORE: %s", strerror(error));
279 else
280 errx(EXIT_FAILURE, "STORE: %s", pwmd_strerror(error));
283 fprintf(stderr, "OK. Testing DELETE of 'namechange\\tsmtp'...\n");
284 snprintf(buf, sizeof(buf), "DELETE namechange\tsmtp\n");
285 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
286 pwmd_close(pwm);
288 if (ret == PWMD_ERROR)
289 errx(EXIT_FAILURE, "DELETE: %s", strerror(error));
290 else
291 errx(EXIT_FAILURE, "DELETE: %s", pwmd_strerror(error));
294 fprintf(stderr, "OK. LIST of account 'namechange'...\n");
295 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, "LIST namechange\n")) != PWMD_OK) {
296 pwmd_close(pwm);
298 if (ret == PWMD_ERROR)
299 errx(EXIT_FAILURE, "LIST: %s", strerror(error));
300 else
301 errx(EXIT_FAILURE, "LIST: %s", pwmd_strerror(error));
304 l = result;
306 while ((p = strsep(&result, "\n")))
307 fprintf(stderr, "%s\n", p);
309 free(l);
310 fprintf(stderr, "OK. ATTR failure...\n");
311 snprintf(buf, sizeof(buf), "ATTR GET someattr namechange\n");
312 if ((ret = pwmd_command(pwm, &result, &error, PWMD_COMMAND, buf)) != PWMD_OK) {
313 if (ret == PWMD_ERROR)
314 warnx("ATTR: %s", strerror(error));
315 else
316 warnx("ATTR: %s", pwmd_strerror(error));
319 if (noagent == 0) {
320 fprintf(stderr, "Setting PWMD_OPTION_DESC...\n");
321 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SETOPT,
322 PWMD_OPTION_DESC, "Enter the new password for file \"testfile\".")) != PWMD_OK) {
323 pwmd_close(pwm);
325 if (ret == PWMD_ERROR)
326 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", strerror(error));
327 else
328 errx(EXIT_FAILURE, "PWMD_SETOPT: %s", pwmd_strerror(error));
332 fprintf(stderr, "OK. SAVE...\n");
333 if ((ret = pwmd_command(pwm, &result, &error, PWMD_SAVE)) != PWMD_OK) {
334 pwmd_close(pwm);
336 if (ret == PWMD_ERROR)
337 errx(EXIT_FAILURE, "SAVE: %s", strerror(error));
338 else if (ret == PWMD_PERROR)
339 errx(EXIT_FAILURE, "SAVE: %s", pwmd_strerror(error));
340 else
341 errx(EXIT_FAILURE, "SAVE: gpg-agent failed. Is GPG_AGENT_INFO set?");
344 pwmd_close(pwm);
346 fprintf(stderr, "Done! delete the file 'testfile' in your PWMD data directory\n");
347 exit(EXIT_SUCCESS);