00001 <?php 00032 class RadiusAuth implements AuthInterface { 00033 00039 private $filename; 00040 00046 private $server; 00047 00053 private $username; 00054 00060 private $password; 00061 00065 private $resource; 00066 00070 private $port = 1812; 00071 00077 private $secret; 00078 00084 private $timeout = 3; 00085 00091 private $max_retries = 3; 00092 00099 public function __construct($auth, $extra_args){ 00100 00101 if(!extension_loaded("radius")){ 00102 throw new AuthException("Debe cargar la extensión de php llamada radius"); 00103 } 00104 00105 foreach(array('server', 'secret') as $param){ 00106 if(isset($extra_args[$param])){ 00107 $this->$param = $extra_args[$param]; 00108 } else { 00109 throw new AuthException("Debe especificar el parametro '$param' en los parámetros"); 00110 } 00111 } 00112 00113 foreach(array('username', 'password') as $param){ 00114 if(isset($extra_args[$param])){ 00115 $this->$param = $extra_args[$param]; 00116 } 00117 } 00118 } 00119 00124 public function get_identity(){ 00125 if(!$this->resource){ 00126 new AuthException("La conexion al servidor Radius es invalida"); 00127 } 00128 $identity = array("username" => $this->username, "realm" => $this->username); 00129 return $identity; 00130 } 00131 00137 public function authenticate(){ 00138 00139 $radius = radius_auth_open(); 00140 if(!$open_radiuse){ 00141 throw new AuthException("No se pudo crear el autenticador de Radius"); 00142 } 00143 00144 if(!radius_add_server($radius, $this->server, $this->port, $this->secret, 00145 $this->timeout, $this->max_retries)) { 00146 throw new AuthException(radius_strerror(0)); 00147 } 00148 00149 if(!radius_create_request($radius, RADIUS_ACCESS_REQUEST)){ 00150 throw new AuthException(radius_strerror(0)); 00151 } 00152 00153 if(!radius_put_string($radius, RADIUS_USER_NAME, $this->username)) { 00154 throw new AuthException(radius_strerror(0)); 00155 } 00156 00157 if(!radius_put_string($radius, RADIUS_USER_PASSWORD, $this->password)) { 00158 throw new AuthException(radius_strerror(0)); 00159 } 00160 00161 if(!radius_put_int($radius, RADIUS_AUTHENTICATE_ONLY, 1)) { 00162 throw new AuthException(radius_strerror(0)); 00163 } 00164 00165 $this->resource = $radius; 00166 00167 if(radius_send_request()==RADIUS_ACCESS_ACCEPT){ 00168 return true; 00169 } else { 00170 return false; 00171 } 00172 00173 } 00174 00179 public function __destruct(){ 00180 if($this->resource){ 00181 radius_close($this->resource); 00182 } 00183 } 00184 00190 public function set_params($extra_args){ 00191 foreach(array('server', 'secret', 'username', 'principal', 00192 'password', 'port', 'max_retries') as $param){ 00193 if(isset($extra_args[$param])){ 00194 $this->$param = $extra_args[$param]; 00195 } 00196 } 00197 } 00198 00199 }