Branch data Line data Source code
1 : : /* md5pwd.c --- Find passwords in UoW imapd MD5 type password files.
2 : : * Copyright (C) 2002-2012 Simon Josefsson
3 : : *
4 : : * This file is part of GNU SASL Library.
5 : : *
6 : : * GNU SASL Library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public License
8 : : * as published by the Free Software Foundation; either version 2.1 of
9 : : * the License, or (at your option) any later version.
10 : : *
11 : : * GNU SASL Library 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 GNU
14 : : * Lesser General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU Lesser General Public
17 : : * License License along with GNU SASL Library; if not, write to the
18 : : * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 : : * Boston, MA 02110-1301, USA.
20 : : *
21 : : */
22 : :
23 : : #include "internal.h"
24 : :
25 : : /**
26 : : * gsasl_simple_getpass:
27 : : * @filename: filename of file containing passwords.
28 : : * @username: username string.
29 : : * @key: newly allocated output character array.
30 : : *
31 : : * Retrieve password for user from specified file. The buffer @key
32 : : * contain the password if this function is successful. The caller is
33 : : * responsible for deallocating it.
34 : : *
35 : : * The file should be on the UoW "MD5 Based Authentication" format,
36 : : * which means it is in text format with comments denoted by # first
37 : : * on the line, with user entries looking as "usernameTABpassword".
38 : : * This function removes CR and LF at the end of lines before
39 : : * processing. TAB, CR, and LF denote ASCII values 9, 13, and 10,
40 : : * respectively.
41 : : *
42 : : * Return value: Return %GSASL_OK if output buffer contains the
43 : : * password, %GSASL_AUTHENTICATION_ERROR if the user could not be
44 : : * found, or other error code.
45 : : **/
46 : : int
47 : 6 : gsasl_simple_getpass (const char *filename, const char *username, char **key)
48 : : {
49 : 6 : size_t userlen = strlen (username);
50 : 6 : char *line = NULL;
51 : 6 : size_t n = 0;
52 : : FILE *fh;
53 : :
54 : 6 : fh = fopen (filename, "r");
55 [ + + ]: 6 : if (fh)
56 : : {
57 [ + - ]: 51 : while (!feof (fh))
58 : : {
59 [ + + ]: 51 : if (getline (&line, &n, fh) < 0)
60 : 2 : break;
61 : :
62 [ + + ]: 49 : if (line[0] == '#')
63 : 25 : continue;
64 : :
65 [ - + ]: 24 : if (line[strlen (line) - 1] == '\r')
66 : 0 : line[strlen (line) - 1] = '\0';
67 [ + - ]: 24 : if (line[strlen (line) - 1] == '\n')
68 : 24 : line[strlen (line) - 1] = '\0';
69 : :
70 [ + + ][ + - ]: 24 : if (strncmp (line, username, userlen) == 0 && line[userlen] == '\t')
71 : : {
72 : 3 : *key = malloc (strlen (line) - userlen);
73 [ - + ]: 3 : if (!*key)
74 : : {
75 : 0 : free (line);
76 : 0 : return GSASL_MALLOC_ERROR;
77 : : }
78 : :
79 : 3 : strcpy (*key, line + userlen + 1);
80 : :
81 : 3 : free (line);
82 : :
83 : 3 : fclose (fh);
84 : :
85 : 3 : return GSASL_OK;
86 : : }
87 : : }
88 : :
89 : 2 : fclose (fh);
90 : : }
91 : :
92 : 3 : free (line);
93 : :
94 : 6 : return GSASL_AUTHENTICATION_ERROR;
95 : : }
|