Ejemplo n.º 1
0
Archivo: pop3.c Proyecto: bbs-io/mbse
void error_popmail(char *umsg)
{
    pop3_close();
    poutCR(LIGHTRED, BLACK, umsg);
}
Ejemplo n.º 2
0
Archivo: pop3.c Proyecto: bbs-io/mbse
int pop3_connect(void)
{
    char		*q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN];
    struct addrinfo	hints, *res = NULL, *p;
    int			rc;

    if (!strlen(CFG.popnode)) {
	WriteError("POP3: host not configured");
	return -1;
    }

    Syslog('+', "POP3: connecting host: %s", CFG.popnode);
    memset(&hints, 0, sizeof(hints));
    hints.ai_family   = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    if ((rc = getaddrinfo(CFG.popnode, "pop3", &hints, &res)) != 0) {
	WriteError("getaddrinfo %s: %s\n", CFG.popnode, gai_strerror(rc));
	return -1;
    }

    for (p = res; p != NULL; p = p->ai_next) {
	void	*addr;

	if (p->ai_family == AF_INET) {
	    struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
	    addr = &(ipv4->sin_addr);
	    ipver = (char *)"IPv4";
	} else {
	    struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
	    addr = &(ipv6->sin6_addr);
	    ipver = (char *)"IPv6";
	}
	inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
	Syslog('+', "Trying %s %s port pop3", ipver, ipstr);

	if ((pop3sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
	    WriteError("$socket()");
	    return -1;
	} else {
	    if (connect(pop3sock, p->ai_addr, p->ai_addrlen) == -1) {
	    	WriteError("$connect %s port pop3", ipstr);
	    	close(pop3sock);
	    } else {
	    	break;
	    }
	}
    }
    if (p == NULL) {
	return -1;	/* Not connected */
    }

    q = pop3_receive();
    if (strlen(q) == 0) {
	WriteError("POP3: no response from server");
	pop3_close();
	return -1;
    }

    if (strncmp(q, "+OK", 3)) {
	WriteError("POP3: bad response: %s", q);
	pop3_close();
	return -1;
    }

    Syslog('+', "POP3: %s", q);

    return pop3sock;
}
Ejemplo n.º 3
0
Archivo: pop3.c Proyecto: bbs-io/mbse
void check_popmail(char *user, char *pass)
{
    char	*p, *q, temp[128];
    int	tmsgs = 0, size, msgnum, color = LIGHTBLUE;
    FILE	*tp;

    /*
     *  If nothing is retrieved from the POP3 mailbox, the user sees nothing.
     */
    if (CFG.UsePopDomain)
	Syslog('+', "POP3: connect user %s@%s", user, CFG.sysdomain);
    else
	Syslog('+', "POP3: connect user %s", user);
    if (pop3_connect() == -1) {
	WriteError("Can't connect POP3 server");
	return;
    }

    if (CFG.UsePopDomain)
	snprintf(temp, 128, "USER %s@%s\r\n", user, CFG.sysdomain);
    else
	snprintf(temp, 128, "USER %s\r\n", user);
    
    if (pop3_cmd(temp)) {
	error_popmail((char *)"You have no email box");
	return;
    }

    snprintf(temp, 128, "PASS %s\r\n", pass);
    if (pop3_cmd(temp)) {
	error_popmail((char *)"Wrong email password, reset your password");
	return;
    }

    Syslog('+', "POP3: logged in");

    pop3_send((char *)"STAT\r\n");
    p = pop3_receive();
    if (strncmp(p, "+OK", 3) == 0) {
	q = strtok(p, " ");
	q = strtok(NULL, " ");
	tmsgs = atoi(q);
	q = strtok(NULL, " \r\n\0");
	size = atoi(q);
	Syslog('+', "POP3: %d messages, %d bytes", tmsgs, size);
	if (tmsgs && ((tp = tmpfile()) != NULL)) {
	    if (pop3_cmd((char *)"LIST\r\n") == 0) {
		while (TRUE) {
		    p = pop3_receive();
		    if (p[0] == '.') {
			break;
		    } else {
			q = strtok(p, " ");
			msgnum = atoi(q);
			fwrite(&msgnum, sizeof(msgnum), 1, tp);
		    }
		}
		rewind(tp);
		while (fread(&msgnum, sizeof(msgnum), 1, tp) == 1) {
		    /*
		     *  Show progress
		     */
		    PUTCHAR('\r');
		    snprintf(temp, 128, "Fetching message %02d/%02d, total %d bytes", msgnum, tmsgs, size);
		    pout(color, BLACK, temp);
		    if (color < WHITE)
			color++;
		    else
			color = LIGHTBLUE;
		    retr_msg(msgnum);
		}
		fclose(tp);
	    }
	}
    }

    pop3_cmd((char *)"QUIT\r\n");
    pop3_close();

    if (tmsgs) {
	PUTCHAR('\r');
	colour(LIGHTMAGENTA, BLACK);
	pout(LIGHTMAGENTA, BLACK, (char *)"                                                ");
	PUTCHAR('\r');
    }
}
Ejemplo n.º 4
0
Archivo: pop3.c Proyecto: skeyby/dbmail
int pop3(ClientSession_T *session, const char *buffer)
{
    /* returns a 0  on a quit
     *           -1  on a failure
     *            1  on a success
     */
    char *command, *value, *searchptr, *enctype, *s;
    Pop3Cmd cmdtype;
    int found = 0;
    //int indx = 0;
    int validate_result;
    bool login_disabled = FALSE;
    uint64_t result, top_lines, top_messageid, user_idnr;
    unsigned char *md5_apop_he;
    struct message *msg;
    ClientBase_T *ci = session->ci;

    s = (char *)buffer;

    strip_crlf(s);
    g_strstrip(s);

    TRACE(TRACE_DEBUG, "incoming buffer: [%s]", s);
    if (! strlen(s)) return 1;

    int state = session->state;
    /* check for command issued */
    /*
    while (strchr(ValidNetworkChars, s[indx++]))
    	;
    	*/

    command = s;

    value = strstr(command, " ");	/* look for the separator */

    if (value != NULL) {
        *value = '\0';	/* set a \0 on the command end */
        value++;	/* skip space */

        if (strlen(value) == 0)
            value = NULL;	/* no value specified */
        else {
            TRACE(TRACE_DEBUG, "state[%d], command issued :cmd [%s], value [%s]\n", state, command, value);
        }
    }

    /* find command that was issued */
    for (cmdtype = POP3_QUIT; cmdtype < POP3_FAIL; cmdtype++)
        if (strcasecmp(command, commands[cmdtype]) == 0) {
            session->was_apop = 1;
            break;
        }

    TRACE(TRACE_DEBUG, "command looked up as commandtype %d",
          cmdtype);

    /* commands that are allowed to have no arguments */
    if (value == NULL) {
        switch (cmdtype) {
        case POP3_QUIT:
        case POP3_LIST:
        case POP3_STAT:
        case POP3_RSET:
        case POP3_NOOP:
        case POP3_LAST:
        case POP3_UIDL:
        case POP3_AUTH:
        case POP3_CAPA:
        case POP3_STLS:
            break;
        default:
            return pop3_error(session, "-ERR your command does not compute\r\n");
            break;
        }
    }

    if (state == CLIENTSTATE_INITIAL_CONNECT) {
        if (server_conf->ssl) {
            Field_T val;
            GETCONFIGVALUE("login_disabled", "POP", val);
            if (SMATCH(val, "yes"))
                login_disabled = TRUE;
        }
    }

    switch (cmdtype) {

    case POP3_QUIT:
        /* We return 0 here, and then pop3_handle_connection cleans up
         * the connection, commits all changes, and sends the final
         * "OK" message indicating that QUIT has completed. */
        session->state = CLIENTSTATE_LOGOUT;

        session->SessionResult = 0;
        pop3_close(session);
        return 0;

    case POP3_STLS:
        if (state != CLIENTSTATE_INITIAL_CONNECT)
            return pop3_error(session, "-ERR wrong command mode\r\n");
        if (! server_conf->ssl)
            return pop3_error(session, "-ERR server error\r\n");

        if (session->ci->sock->ssl_state)
            return pop3_error(session, "-ERR TLS already active\r\n");
        ci_write(session->ci, "+OK Begin TLS now\r\n");
        if (ci_starttls(session->ci) < 0) return -1;
        return 1;

    case POP3_USER:
        if (state != CLIENTSTATE_INITIAL_CONNECT)
            return pop3_error(session, "-ERR wrong command mode\r\n");

        if (login_disabled && ! session->ci->sock->ssl_state)
            return pop3_error(session, "-ERR try STLS\r\n");

        if (session->username != NULL) {
            /* reset username */
            g_free(session->username);
            session->username = NULL;
        }

        if (session->username == NULL) {
            /* create memspace for username */
            session->username = g_new0(char,strlen(value) + 1);
            strncpy(session->username, value, strlen(value) + 1);
        }

        ci_write(ci, "+OK Password required for %s\r\n", session->username);
        return 1;

    case POP3_PASS:
        if (state != CLIENTSTATE_INITIAL_CONNECT)
            return pop3_error(session, "-ERR wrong command mode\r\n");

        if (login_disabled && ! session->ci->sock->ssl_state)
            return pop3_error(session, "-ERR try STLS\r\n");

        if (session->password != NULL) {
            g_free(session->password);
            session->password = NULL;
        }

        if (session->password == NULL) {
            /* create memspace for password */
            session->password = g_new0(char,strlen(value) + 1);
            strncpy(session->password, value, strlen(value) + 1);
        }