int dual_tls_recv(rad_listen_t *listener) { RADIUS_PACKET *packet; RAD_REQUEST_FUNP fun = NULL; listen_socket_t *sock = listener->data; RADCLIENT *client = sock->client; if (listener->status != RAD_LISTEN_STATUS_KNOWN) return 0; if (!tls_socket_recv(listener)) { return 0; } rad_assert(sock->packet != NULL); rad_assert(sock->tls_session != NULL); rad_assert(client != NULL); packet = talloc_steal(NULL, sock->packet); sock->packet = NULL; gettimeofday(&packet->timestamp, NULL); /* * Some sanity checks, based on the packet code. * * "auth+acct" are marked as "auth", with the "dual" flag * set. */ switch (packet->code) { case PW_CODE_ACCESS_REQUEST: if (listener->type != RAD_LISTEN_AUTH) goto bad_packet; FR_STATS_INC(auth, total_requests); fun = rad_authenticate; break; #ifdef WITH_ACCOUNTING case PW_CODE_ACCOUNTING_REQUEST: if (listener->type != RAD_LISTEN_ACCT) { /* * Allow auth + dual. Disallow * everything else. */ if (!((listener->type == RAD_LISTEN_AUTH) && (listener->dual))) { goto bad_packet; } } FR_STATS_INC(acct, total_requests); fun = rad_accounting; break; #endif case PW_CODE_STATUS_SERVER: if (!main_config.status_server) { FR_STATS_INC(auth, total_unknown_types); WARN("Ignoring Status-Server request due to security configuration"); fr_radius_free(&packet); return 0; } fun = rad_status_server; break; default: bad_packet: FR_STATS_INC(auth, total_unknown_types); DEBUG("Invalid packet code %d sent from client %s port %d : IGNORED", packet->code, client->shortname, packet->src_port); fr_radius_free(&packet); return 0; } /* switch over packet types */ if (!request_receive(NULL, listener, packet, client, fun)) { FR_STATS_INC(auth, total_packets_dropped); fr_radius_free(&packet); return 0; } return 1; }
int dual_tls_recv(rad_listen_t *listener) { RADIUS_PACKET *packet; REQUEST *request; RAD_REQUEST_FUNP fun = NULL; listen_socket_t *sock = listener->data; RADCLIENT *client = sock->client; if (!tls_socket_recv(listener)) { return 0; } rad_assert(sock->request != NULL); rad_assert(sock->request->packet != NULL); rad_assert(sock->packet != NULL); rad_assert(sock->ssn != NULL); request = sock->request; packet = sock->packet; /* * Some sanity checks, based on the packet code. */ switch(packet->code) { case PW_AUTHENTICATION_REQUEST: if (listener->type != RAD_LISTEN_AUTH) goto bad_packet; FR_STATS_INC(auth, total_requests); fun = rad_authenticate; break; case PW_ACCOUNTING_REQUEST: if (listener->type != RAD_LISTEN_ACCT) goto bad_packet; FR_STATS_INC(acct, total_requests); fun = rad_accounting; break; case PW_STATUS_SERVER: if (!mainconfig.status_server) { FR_STATS_INC(auth, total_unknown_types); DEBUG("WARNING: Ignoring Status-Server request due to security configuration"); rad_free(&sock->packet); request->packet = NULL; return 0; } fun = rad_status_server; break; default: bad_packet: FR_STATS_INC(auth, total_unknown_types); DEBUG("Invalid packet code %d sent from client %s port %d : IGNORED", packet->code, client->shortname, packet->src_port); rad_free(&sock->packet); request->packet = NULL; return 0; } /* switch over packet types */ if (!request_receive(listener, packet, client, fun)) { FR_STATS_INC(auth, total_packets_dropped); rad_free(&sock->packet); request->packet = NULL; return 0; } sock->packet = NULL; /* we have no need for more partial reads */ request->packet = NULL; return 1; }
int dual_tls_recv(rad_listen_t *listener) { RADIUS_PACKET *packet; RAD_REQUEST_FUNP fun = NULL; listen_socket_t *sock = listener->data; RADCLIENT *client = sock->client; BIO *rbio; if (listener->status != RAD_LISTEN_STATUS_KNOWN) return 0; redo: if (!tls_socket_recv(listener)) { return 0; } rad_assert(sock->packet != NULL); rad_assert(sock->ssn != NULL); rad_assert(client != NULL); packet = talloc_steal(NULL, sock->packet); sock->packet = NULL; /* * Some sanity checks, based on the packet code. * * "auth+acct" are marked as "auth", with the "dual" flag * set. */ switch (packet->code) { case PW_CODE_ACCESS_REQUEST: if (listener->type != RAD_LISTEN_AUTH) goto bad_packet; FR_STATS_INC(auth, total_requests); fun = rad_authenticate; break; #ifdef WITH_ACCOUNTING case PW_CODE_ACCOUNTING_REQUEST: if (listener->type != RAD_LISTEN_ACCT) { /* * Allow auth + dual. Disallow * everything else. */ if (!((listener->type == RAD_LISTEN_AUTH) && (listener->dual))) { goto bad_packet; } } FR_STATS_INC(acct, total_requests); fun = rad_accounting; break; #endif case PW_CODE_STATUS_SERVER: if (!main_config.status_server) { FR_STATS_INC(auth, total_unknown_types); WARN("Ignoring Status-Server request due to security configuration"); rad_free(&packet); return 0; } fun = rad_status_server; break; default: bad_packet: FR_STATS_INC(auth, total_unknown_types); DEBUG("Invalid packet code %d sent from client %s port %d : IGNORED", packet->code, client->shortname, packet->src_port); rad_free(&packet); return 0; } /* switch over packet types */ if (!request_receive(NULL, listener, packet, client, fun)) { FR_STATS_INC(auth, total_packets_dropped); rad_free(&packet); return 0; } /* * Check for more application data. * * If there is pending SSL data, "peek" at the * application data. If we get at least one byte of * application data, go back to tls_socket_recv(). * SSL_peek() will set SSL_pending(), and * tls_socket_recv() will read another packet. */ rbio = SSL_get_rbio(sock->ssn->ssl); if (BIO_ctrl_pending(rbio)) { char buf[1]; int peek = SSL_peek(sock->ssn->ssl, buf, 1); if (peek > 0) { DEBUG("more TLS records after dual_tls_recv"); goto redo; } } return 1; }