size_t hdr_len, len;
if (pkt->hdr.ver.major != TAC_PLUS_MAJOR_VER || pkt->hdr.ver.minor & 0xe) { /* minor == {0,1} */
- ERROR("Unsupported version %u.%u", pkt->hdr.ver.major, pkt->hdr.ver.minor);
+ fr_strerror_printf("Unsupported version %u.%u", pkt->hdr.ver.major, pkt->hdr.ver.minor);
return false;
}
case TAC_PLUS_AUTHEN:
if ((from_client && pkt->hdr.seq_no % 2 != 1) || (!from_client && pkt->hdr.seq_no % 2 != 0)) {
bad_seqno:
- ERROR("Invalid sequence number %u (from_client = %s)", pkt->hdr.seq_no, from_client ? "true" : "false");
+ fr_strerror_printf("Invalid sequence number %u (from_client = %s)", pkt->hdr.seq_no, from_client ? "true" : "false");
return false;
}
if (pkt->hdr.seq_no == 255) {
- ERROR("client sent seq_no set to 255");
+ fr_strerror_printf("client sent seq_no set to 255");
return false;
}
case 1:
len = pkt->authen.start.user_len + pkt->authen.start.port_len + pkt->authen.start.rem_addr_len + pkt->authen.start.data_len;
if (len + offsetof(tacacs_packet_authen_start_hdr_t, body) != hdr_len) {
- ERROR("Authen START Header/Body size mismatch");
+ fr_strerror_printf("Authen START Header/Body size mismatch");
return false;
}
break;
if (from_client) {
len = ntohs(pkt->authen.cont.user_msg_len) + ntohs(pkt->authen.cont.data_len);
if (len + offsetof(tacacs_packet_authen_cont_hdr_t, body) != hdr_len) {
- ERROR("Authen CONTINUE Header/Body size mismatch");
+ fr_strerror_printf("Authen CONTINUE Header/Body size mismatch");
return false;
}
} else {
len = ntohs(pkt->authen.reply.server_msg_len) + ntohs(pkt->authen.reply.data_len);
if (len + offsetof(tacacs_packet_authen_reply_hdr_t, body) != hdr_len) {
- ERROR("Authen REPLY Header/Body size mismatch");
+ fr_strerror_printf("Authen REPLY Header/Body size mismatch");
return false;
}
}
for (unsigned int i = 0; i < pkt->author.req.arg_cnt; i++)
len += pkt->author.req.body[i];
if (len + offsetof(tacacs_packet_author_req_hdr_t, body) != hdr_len) {
- ERROR("Author REQUEST Header/Body size mismatch");
+ fr_strerror_printf("Author REQUEST Header/Body size mismatch");
return false;
}
} else {
for (unsigned int i = 0; i < pkt->author.res.arg_cnt; i++)
len += pkt->author.res.body[i];
if (len + offsetof(tacacs_packet_author_res_hdr_t, body) != hdr_len) {
- ERROR("Author RESPONSE Header/Body size mismatch");
+ fr_strerror_printf("Author RESPONSE Header/Body size mismatch");
return false;
}
}
for (unsigned int i = 0; i < pkt->acct.req.arg_cnt; i++)
len += pkt->acct.req.body[i];
if (len + offsetof(tacacs_packet_acct_req_hdr_t, body) != hdr_len) {
- ERROR("Acct REQUEST Header/Body size mismatch");
+ fr_strerror_printf("Acct REQUEST Header/Body size mismatch");
return false;
}
flags = pkt->acct.req.flags & 0xe;
if (flags == 0x0 || flags == 0x6 || flags == 0xc || flags == 0xe) {
/* FIXME send to client TACACS-Accounting-Status Error */
- ERROR("Acct RESPONSE invalid flags set");
+ fr_strerror_printf("Acct RESPONSE invalid flags set");
return false;
}
} else {
len = pkt->acct.res.server_msg_len + pkt->acct.res.data_len;
if (len + offsetof(tacacs_packet_acct_res_hdr_t, body) != hdr_len) {
- ERROR("Acct RESPONSE Header/Body size mismatch");
+ fr_strerror_printf("Acct RESPONSE Header/Body size mismatch");
return false;
}
}
if (pkt->hdr.flags & TAC_PLUS_UNENCRYPTED_FLAG)
return 0;
else {
- ERROR("Packet is encrypted but no secret for the client is set");
+ fr_strerror_printf("Packet is encrypted but no secret for the client is set");
return -1;
}
}
if (pkt->hdr.flags & TAC_PLUS_UNENCRYPTED_FLAG) {
- ERROR("Packet is unencrypted but a secret has been set for the client");
+ fr_strerror_printf("Packet is unencrypted but a secret has been set for the client");
return -1;
}
break;
default:
- ERROR("Unsupported TACACS+ type %u", pkt->hdr.type);
+ fr_strerror_printf("Unsupported TACACS+ type %u", pkt->hdr.type);
return -1;
}
* See if it's a well-formed TACACS packet.
*/
if (!tacacs_ok(packet, true)) {
- fr_strerror_printf("Failed validation of TACACS request (incorrect secret?)");
return -1;
}
return -1;
}
+ /*
+ * @fixme: EINTR and retry
+ */
return write(packet->sockfd, packet->data, packet->data_len);
}