diff options
author | Kozlov Dmitry <dima@server> | 2010-09-13 11:59:21 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-09-13 11:59:21 +0400 |
commit | a670641cc3c420bfd9026d3711501663aef88287 (patch) | |
tree | b2754ce3e83978759dd6ccfc7fbc1d0d0e1d96b7 /accel-pptpd/radius/packet.c | |
parent | 5ef0b9025a019aeb8502cd687d17a1e0b7aa0ca4 (diff) | |
download | accel-ppp-xebd-a670641cc3c420bfd9026d3711501663aef88287.tar.gz accel-ppp-xebd-a670641cc3c420bfd9026d3711501663aef88287.zip |
radius: implemnted mschap-v2 authorization
Diffstat (limited to 'accel-pptpd/radius/packet.c')
-rw-r--r-- | accel-pptpd/radius/packet.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/accel-pptpd/radius/packet.c b/accel-pptpd/radius/packet.c index 53f3885..0aeafa5 100644 --- a/accel-pptpd/radius/packet.c +++ b/accel-pptpd/radius/packet.c @@ -96,8 +96,9 @@ struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr) struct rad_packet_t *pack; struct rad_attr_t *attr; struct rad_dict_attr_t *da; + struct rad_dict_vendor_t *vendor; uint8_t *ptr; - int n, id, len; + int n, id, len, vendor_id; socklen_t addr_len = sizeof(*addr); pack = rad_packet_alloc(0); @@ -154,13 +155,26 @@ struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr) log_ppp_warn("radius:packet: too long attribute received (%i, %i)\n", id, len); goto out_err; } - da = rad_dict_find_attr_id(id); + if (id == 26) { + vendor_id = ntohl(*(uint32_t *)ptr); + vendor = rad_dict_find_vendor_id(vendor_id); + if (vendor) { + ptr += 4; + id = *ptr; ptr++; + len = *ptr - 2; ptr++; + n -= 2 + len; + } else + log_ppp_warn("radius:packet: vendor %s not found\n", id); + } + da = rad_dict_find_attr_id(vendor, id); if (da) { attr = malloc(sizeof(*attr)); if (!attr) { log_emerg("radius:packet: out of memory\n"); goto out_err; } + memset(attr, 0, sizeof(*attr)); + attr->vendor = vendor; attr->attr = da; attr->len = len; switch (da->type) { @@ -555,3 +569,20 @@ int rad_packet_add_vendor_octets(struct rad_packet_t *pack, const char *vendor_n return 0; } +struct rad_attr_t *rad_packet_find_vendor_attr(struct rad_packet_t *pack, const char *vendor_name, const char *name) +{ + struct rad_attr_t *ra; + + list_for_each_entry(ra, &pack->attrs, entry) { + if (!ra->vendor) + continue; + if (strcmp(ra->vendor->name, vendor_name)) + continue; + if (strcmp(ra->attr->name, name)) + continue; + + return ra; + } + + return NULL; +} |