1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/* $Id: sendpass.c 8921 2010-01-22 23:33:08Z iulius $
**
*/
#include "config.h"
#include "clibrary.h"
#include <ctype.h>
#include <errno.h>
#include "inn/innconf.h"
#include "inn/libinn.h"
#include "inn/nntp.h"
#include "inn/paths.h"
/*
** Send authentication information to an NNTP server.
*/
int NNTPsendpassword(char *server, FILE *FromServer, FILE *ToServer)
{
FILE *F;
char *p;
char *path;
char buff[SMBUF];
char input[SMBUF];
char *user;
char *pass;
char *style;
int oerrno;
bool authenticated;
/* Default to innconf->server. If that's not set either, error out. Fake
errno since some of our callers rely on it. */
if (server == NULL)
server = innconf->server;
if (server == NULL) {
errno = EINVAL;
return -1;
}
/* Open the password file; coarse check on errno, but good enough. */
path = concatpath(innconf->pathetc, INN_PATH_NNTPPASS);
F = fopen(path, "r");
free(path);
if (F == NULL)
return errno == EPERM ? -1 : 0;
/* Scan the file, skipping blank and comment lines. */
while (fgets(buff, sizeof buff, F) != NULL) {
if ((p = strchr(buff, '\n')) != NULL)
*p = '\0';
if (buff[0] == '\0' || buff[0] == '#')
continue;
/* Parse the line. */
if ((user = strchr(buff, ':')) == NULL)
continue;
*user++ = '\0';
if ((pass = strchr(user, ':')) == NULL)
continue;
*pass++ = '\0';
if ((style = strchr(pass, ':')) != NULL) {
*style++ = '\0';
if (strcmp(style, "authinfo") != 0) {
errno = EDOM;
break;
}
}
if (strcasecmp(server, buff) != 0)
continue;
authenticated = false;
if (*user) {
/* Send the first part of the command, get a reply. */
fprintf(ToServer, "AUTHINFO USER %s\r\n", user);
if (fflush(ToServer) == EOF || ferror(ToServer))
break;
if (fgets(input, sizeof input, FromServer) == NULL)
break;
if (atoi(input) == NNTP_OK_AUTHINFO)
authenticated = true;
else if (atoi(input) != NNTP_CONT_AUTHINFO)
break;
}
if (*pass && !authenticated) {
/* Send the second part of the command, get a reply. */
fprintf(ToServer, "AUTHINFO PASS %s\r\n", pass);
if (fflush(ToServer) == EOF || ferror(ToServer))
break;
if (fgets(input, sizeof input, FromServer) == NULL
|| atoi(input) != NNTP_OK_AUTHINFO)
break;
}
/* Authenticated. */
fclose(F);
return 0;
}
/* End of file without finding a password, that's okay. */
if (feof(F)) {
fclose(F);
return 0;
}
/* Save errno, close the file, fail. */
oerrno = errno;
fclose(F);
errno = oerrno;
return -1;
}
|