1 /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved.
2 See the file COPYING for licensing information. */
4 #if defined HAVE_CONFIG_H
9 #include <event2/bufferevent.h>
10 #include <radsec/radsec.h>
11 #include <radsec/radsec-impl.h>
17 #include <sys/socket.h>
18 #include <event2/buffer.h>
21 /* Badly named helper function for preparing a RADIUS message and
22 queue it. FIXME: Rename. */
24 packet_do_send (struct rs_packet *pkt)
26 VALUE_PAIR *vp = NULL;
29 assert (!pkt->original);
31 /* Add Message-Authenticator, RFC 2869. */
32 /* FIXME: Make Message-Authenticator optional? */
33 vp = paircreate (PW_MESSAGE_AUTHENTICATOR, PW_TYPE_OCTETS);
35 return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
36 "paircreate: %s", fr_strerror ());
37 pairadd (&pkt->rpkt->vps, vp);
39 if (rad_encode (pkt->rpkt, NULL, pkt->conn->active_peer->secret))
40 return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
41 "rad_encode: %s", fr_strerror ());
42 if (rad_sign (pkt->rpkt, NULL, pkt->conn->active_peer->secret))
43 return rs_err_conn_push_fl (pkt->conn, RSE_FR, __FILE__, __LINE__,
44 "rad_sign: %s", fr_strerror ());
47 char host[80], serv[80];
49 getnameinfo (pkt->conn->active_peer->addr->ai_addr,
50 pkt->conn->active_peer->addr->ai_addrlen,
51 host, sizeof(host), serv, sizeof(serv),
52 0 /* NI_NUMERICHOST|NI_NUMERICSERV*/);
53 rs_debug (("%s: about to send this to %s:%s:\n", __func__, host, serv));
60 int err = bufferevent_write (pkt->conn->bev, pkt->rpkt->data,
63 return rs_err_conn_push_fl (pkt->conn, RSE_EVENT, __FILE__, __LINE__,
64 "bufferevent_write: %s",
65 evutil_gai_strerror (err));
69 struct rs_packet **pp = &pkt->conn->out_queue;
71 while (*pp && (*pp)->next)
79 /* Public functions. */
81 rs_packet_create (struct rs_connection *conn, struct rs_packet **pkt_out)
90 return rs_err_conn_push (conn, RSE_NOMEM, __func__);
91 rpkt->id = conn->nextid++;
93 p = (struct rs_packet *) malloc (sizeof (struct rs_packet));
97 return rs_err_conn_push (conn, RSE_NOMEM, __func__);
99 memset (p, 0, sizeof (struct rs_packet));
108 rs_packet_create_authn_request (struct rs_connection *conn,
109 struct rs_packet **pkt_out,
110 const char *user_name, const char *user_pw)
112 struct rs_packet *pkt;
113 struct rs_attr *attr;
115 if (rs_packet_create (conn, pkt_out))
118 pkt->rpkt->code = PW_AUTHENTICATION_REQUEST;
122 if (rs_attr_create (conn, &attr, "User-Name", user_name))
124 rs_packet_add_attr (pkt, attr);
128 if (rs_attr_create (conn, &attr, "User-Password", user_pw))
130 rs_packet_add_attr (pkt, attr);
138 rs_packet_add_attr (struct rs_packet *pkt, struct rs_attr *attr)
140 pairadd (&pkt->rpkt->vps, attr->vp);
144 struct radius_packet *
145 rs_packet_frpkt (struct rs_packet *pkt)
152 rs_packet_destroy (struct rs_packet *pkt)
156 // FIXME: memory leak! TODO: free all attributes
157 rad_free (&pkt->rpkt);
158 rs_free (pkt->conn->ctx, pkt);