|
From: Paul L. <pdo...@us...> - 2005-05-21 19:36:24
|
Update of /cvsroot/serverfilters/serversidefilter/script In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14528/script Added Files: checkcreds_imap.c Log Message: Initial checkin --- NEW FILE: checkcreds_imap.c --- /* * Credential checking using IMAP * * David Phillips <david <at> geektech.com> * * Public domain * */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <errno.h> #include <netdb.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // error definitions #include "filtercmd.h" char *checkcreds_extra_configvar = ""; static int socket_connect(const char *host, int port) { struct in_addr addr; struct hostent *hent; struct sockaddr_in saddr; int s; int r; if (inet_aton(host, &addr) == 0) { hent = gethostbyname(host); if (hent == NULL) return -1; addr = *((struct in_addr *)hent->h_addr); } saddr.sin_family = AF_INET; saddr.sin_addr = addr; saddr.sin_port = htons(port); memset(&saddr.sin_zero, 0, 8); s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) return -1; if (connect(s, (struct sockaddr *)&saddr, sizeof(struct sockaddr)) == -1) { close(s); return -1; } return s; } int checkcredentials(imapserver, imapport, user, passwd, extra) char *imapserver; int imapport; char *user; char *passwd; char *extra; { char LOGOUT[] = "a2 LOGOUT\r\n"; int s; char buf[4096]; FILE *fp; s = socket_connect(imapserver, imapport); if (s == -1) return ERR_CANT_READ_IMAP_SERVER; fp = fdopen(s, "r+"); if (fgets(buf, sizeof(buf), fp) == NULL) goto error; fprintf(fp, "a1 LOGIN %s %s\r\n", user, passwd); if (fgets(buf, sizeof(buf), fp) == NULL) goto error; fprintf(fp, "a2 LOGOUT\r\n"); fclose(fp); #ifdef DEBUG fprintf(stderr, "IMAP response: %s\n", buf); #endif if (strstr(buf, "OK") == NULL) return ERR_BAD_CREDENTIALS; return ERR_OK; error: fclose(fp); return ERR_CANT_READ_IMAP_SERVER; } |