1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
|
/*
* RadiusClass -- An C++-Library for radius authentication
* and accounting.
*
* Copyright (C) 2005 EWE TEL GmbH/Ralf Luebben <ralfluebben@gmx.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "RadiusVendorSpecificAttribute.h"
#include <stdlib.h>
#include "error.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/** The constructor sets the type,id and length to 0 and the value to NULL.*/
RadiusVendorSpecificAttribute::RadiusVendorSpecificAttribute(void)
{
memset(this->id, 0, 4);
this->type=0;
this->length=0;
this->value=NULL;
}
/** The destructor of the class.
* It frees the allocated memory for the value, if the pointer is not NULL.
*/
RadiusVendorSpecificAttribute::~RadiusVendorSpecificAttribute(void)
{
if (this->value)
{
delete [] this->value;
}
}
/** Creates a dump of an attribute.
*/
void RadiusVendorSpecificAttribute::dumpRadiusAttrib(void)
{
int i;
fprintf(stdout,"\tid\t\t:\t%d%d%d%d\t|",this->id[0],this->id[1],this->id[2],this->id[3]);
fprintf(stdout,"\ttype\t\t:\t%d\t|",this->type);
fprintf(stdout,"\tlength\t:\t%d\t|",this->getLength());
fprintf(stdout,"\tvalue\t:\t ->");
for(i=0;i<((this->getLength())-6);i++)
fputc(this->value[i],stdout);
fprintf(stdout,"<-\n");
}
/** The getter method for the length of the attribute
* @return The length as an integer.
*/
int RadiusVendorSpecificAttribute::getLength(void)
{
return (this->length);
}
/** The getter method for the length of the attribute
* @return The length as a pointer.
*/
Octet * RadiusVendorSpecificAttribute::getLength_Octet(void)
{
return (&this->length);
}
/** The setter method for the length of the attribut.
* Normally it calculated automatically.
* @param len The length as datatype unsigned char (=Octet).
*/
void RadiusVendorSpecificAttribute::setLength(Octet len)
{
this->length=len;
}
/** The getter method for the id of the attribute.
* @return An integer with the id.
*/
int RadiusVendorSpecificAttribute::getId(void)
{
return ntohl(*(int*)this->id);
}
/** The getter method for the id of the attribute.
* @return An pointer to an Octet value. (still in network byte order).
*/
Octet * RadiusVendorSpecificAttribute::getId_Octet(void)
{
return (this->id);
}
/** The setter method for the id of the attribute.
* @param id The vendor id as integer.
*/
void RadiusVendorSpecificAttribute::setId(int id)
{
int tmp_id=htonl(id);
memcpy(this->id,&tmp_id,4);
}
/** The getter method for the type of the attribute.
* @return An integer with the type.
*/
int RadiusVendorSpecificAttribute::getType(void)
{
return (this->type);
}
/** The getter method for the type of the attribute.
* @return A pointer to the value.
*/
Octet * RadiusVendorSpecificAttribute::getType_Octet(void)
{
return (&this->type);
}
/** The setter method for the type of the attribute.
* @param type The type as Octet.
*/
void RadiusVendorSpecificAttribute::setType(Octet type)
{
this->type=type;
}
/** The getter method for the value.
* @return The value as an Octet.*/
Octet * RadiusVendorSpecificAttribute::getValue(void)
{
return (this->value);
}
/** Decodes a vendor specific attribute from a buffer.
* @param value A pointer to the a buffer which keeps a vendor specific attribute.
* @return An integer which indicates errors, 0 if everthing is ok,
* else a number defined in the error.h.
*/
int RadiusVendorSpecificAttribute::decodeRecvAttribute(Octet * v)
{
memcpy(this->id, v, 4);
this->type=v[4];
this->length=v[5];
if(!(this->value=new Octet[int(this->length)-2]))
{
return ALLOC_ERROR;
}
memcpy(this->value, v+6, (int(this->length)-2));
return 0;
}
/** Transform a attribute value to an integer, this makes only sense
* if the datatype is an integer. This dependents on the definition
* in the radius RFC or can be locked up in the file radius.h of this
* source code.
* @return The transformed integer.
*/
int RadiusVendorSpecificAttribute::intFromBuf(void)
{
return (ntohl(*(int*)this->value));
}
/**The overloading of the assignment operator.*/
RadiusVendorSpecificAttribute & RadiusVendorSpecificAttribute::operator=(const RadiusVendorSpecificAttribute &ra)
{
memcpy(this->id, ra.id, 4);
this->value=new Octet[ra.length-2];
this->type=ra.type;
this->length=ra.length;
memcpy(this->value,ra.value,ra.length-2);
return *this;
}
/**The copy constructor.*/
RadiusVendorSpecificAttribute::RadiusVendorSpecificAttribute(const RadiusVendorSpecificAttribute &ra)
{
this->value=new Octet[ra.length-2];
memcpy(this->id, ra.id, 4);
this->type=ra.type;
this->length=ra.length;
memcpy(this->value,ra.value,ra.length-2);
}
/**The method sets the value and the length.
* @param value A string.
* @return An integer. 0 if everything is ok, else !=0.
*/
int RadiusVendorSpecificAttribute::setValue(const char * value)
{
int length=strlen(value);
if(!(this->value=new Octet[length]))
{
return ALLOC_ERROR;
}
this->length=length+2;
memcpy(this->value,value,length);
return 0;
}
/**The method sets the value and the length.
* @param value An integer.
* @return An integer. 0 if everything is ok, else !=0.
*/
int RadiusVendorSpecificAttribute::setValue(int value)
{
int tmp_value=htonl(value);
if(!(this->value=new Octet[4]))
{
return ALLOC_ERROR;
}
this->length=6;
memcpy(this->value,&tmp_value,4);
return 0;
}
/** The method converts the value into an ip.
* The attribute must have the right datatype IPADDRESS.
* @return The ip address as a string.
*/
string RadiusVendorSpecificAttribute::ipFromBuf(void)
{
int num,i;
char ip2[4],ip3[16];
memset(ip3,0,16);
for (i=0;i<(this->length-2);i++)
{
num=(int)this->value[i];
if(i==0)
{
sprintf(ip3,"%i",num);
strcat(ip3,".");
}
else if (i<3)
{
sprintf(ip2,"%i",num);
strcat(ip3,ip2);
strcat(ip3,".");
}
else
{
sprintf(ip2,"%i",num);
strcat(ip3,ip2);
}
}
return string(ip3);
}
/** The method converts the value into a strung.
* @return The value as a string.
*/
string RadiusVendorSpecificAttribute::stringFromBuf(void)
{
char * tmp_str = new char[this->length-1];
memcpy(tmp_str, this->value, this->length-2);
tmp_str[this->length-2]=0;
return string(tmp_str);
}
/** The method copies id, type, length an value in
* an array Octet * rvsa for sending.
* @param rvsa A pointer to an array for whole attribute, it must be have the right length.
*/
void RadiusVendorSpecificAttribute::getShapedAttribute(Octet * rvsa)
{
memcpy(rvsa,this->id,4);
memcpy(rvsa+4,&(this->type),1);
memcpy(rvsa+5,&(this->length),1);
memcpy(rvsa+6, this->value,this->length-2);
}
|