Index: pop_root.c =================================================================== RCS file: /usr/local/cvsroot/popa3d/pop_root.c,v retrieving revision 1.1.1.1 retrieving revision 1.6 diff -r1.1.1.1 -r1.6 7a8 > #include 156a158,314 > * Checks if the user is specified in /etc/pop3.{allow,deny} file > */ > int is_user_specified_in_file(char *user, char *path) > { > int fd, userlen; > long len; > char *buffer, *ptr; > struct stat sb; > > /* Sanity checks */ > if (!user) { > errno = EINVAL; > syslog(SYSLOG_PRIORITY, "is_user_specified_in_file: %m"); > return -1; > } > > /* Initialization */ > userlen = strlen( user); > > /* > * Read /etc/pop3.{allow,deny} file, or omit the check if the file > * doesn't exist or an error ocurred. > */ > fd = open( path, O_RDONLY); > if (fd == -1) { > if (errno != ENOENT) { > log_error( "open"); > } > return -1; > } > > if (fstat( fd, &sb)) { > log_error( "fstat"); > close( fd); > return -1; > } > > len = sb.st_size; > buffer = (char*) malloc( len + 1); > if (!buffer) { > log_error( "malloc"); > close( fd); > return -1; > } > > if (read( fd, buffer, len) != len) { > log_error( "read"); > close( fd); > free( buffer); > return -1; > } > > if (close( fd)) { > log_error( "close"); > free( buffer); > return -1; > } > > buffer[len] = '\0'; > > /* Find the username */ > ptr = buffer; > while (*ptr != '\0') { > > /* Omit the whitespaces */ > while (*ptr == '\t' || *ptr == ' ') { > ptr++; > } > > /* End of content? */ > if (*ptr == '\0') { > break; > } > > /* Compare the username */ > if ((*ptr != '#') && > (strncmp( ptr, user, userlen) == 0) && > (ptr[userlen] == ' ' || > ptr[userlen] == '\t' || > ptr[userlen] == '\n')) { > > free( buffer); > return 1; > } > > /* Next line */ > while (*ptr != '\0' && *ptr != '\n') { > ptr++; > } > > if (*ptr == '\n') { > ptr++; > } > } > > /* Free resources */ > free( buffer); > return 0; > } > > /* > * Checks if the user is allowed to log-in (/etc/pop3.{allow,deny} support) > */ > int is_user_allowed( char *user) > { > int allow, deny; > > /* Is user specified in /etc/pop3.allow file ? */ > switch (is_user_specified_in_file( user, "/etc/pop3.allow")) { > case 0: > allow = 0; > break; > case 1: > allow = 1; > break; > default: > if (errno != ENOENT) { > return -1; > } > allow = -1; > break; > } > > /* Not allowed */ > if (allow == 0) { > return 1; > } > > /* Is user specified in /etc/pop3.deny file ? */ > switch (is_user_specified_in_file( user, "/etc/pop3.deny")) { > case 0: > deny = 0; > break; > case 1: > deny = 1; > break; > default: > if (errno != ENOENT) { > return -1; > } > deny = -1; > break; > } > > /* Is user allowed ? */ > if ((allow == -1 && deny == 0) || > (allow == 1 && (deny == -1 || deny == 0))) { > > /* User is allowed */ > return 0; > } > > /* Not allowed */ > return 1; > } > > /* 181a340,350 > > /* If the user is allowed ? */ > switch (is_user_allowed( user)) { > case -1: > return AUTH_NONE; > case 1: > mailbox = user; > return AUTH_FAILED; > default: > break; > }