shell bypass 403
<?
App::uses('InmuebleEstado', 'Model');
App::uses('InmuebleGestion', 'Model');
App::uses('InmuebleTipo', 'Model');
App::uses('Provincia', 'Model');
App::uses('Localidad', 'Model');
App::uses('Zona', 'Model');
class Vivienda extends AppModel {
public $useTable = 'viviendas';
public $validate = array(
'inmueble_estado_id' => array(
'exist' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar un estado existente'
)
),
'inmueble_gestion_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Tipo de gestión requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar un tipo de gestión existente'
)
),
'inmueble_tipo_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Tipo de inmueble requerido'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar un tipo de inmueble existente'
)
),
'provincia_id' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Provincia requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar una provincia existente'
)
),
'localidad_id' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'notEmpty',
'message' => 'Localidad requerida'
),
'exist' => array(
'rule' => 'checkExist',
'message' => 'Debes seleccionar una localidad existente'
)
),
'zona_id' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar una zona existente'
)
),
'precio' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio ha de ser mayor que 0'
),
'alquiler' => array(
'rule' => 'checkPrecioAlquiler',
'message' => 'El precio de alquiler es obligatorio para inmuebles de alquiler'
)
),
'precio_oferta' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio de oferta ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio de oferta ha de ser mayor que 0'
),
'precio' => array(
'rule' => 'checkMayorPrecio',
'message' => 'El precio de oferta ha de ser menor que el precio'
)
),
'precio_alquiler' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El precio de alquiler ha de ser un valor numérico'
),
'zero' => array(
'rule' => 'checkZero',
'message' => 'El precio de alquiler ha de ser mayor que 0'
)
),
'eficiencia_energetica' => array(
'required' => array(
'allowEmpty' => true,
'rule' => 'checkExist',
'message' => 'Debes seleccionar una eficiencia energética existente'
)
),
'num_habitaciones' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de habitaciones ha de ser un valor numérico'
)
),
'num_banos' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de baños ha de ser un valor numérico'
)
),
'num_aseos' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'El número de aseos ha de ser un valor numérico'
)
),
'superficie_parcela' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie de la parcela ha de ser un valor numérico'
)
),
'superficie_construida' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie construida ha de ser un valor numérico'
)
),
'superficie_util' => array(
'numeric' => array(
'allowEmpty' => true,
'rule' => 'numeric',
'message' => 'La superficie útil ha de ser un valor numérico'
)
),
);
public function checkExist($check) {
$elemento = null;
$campo = key($check);
switch ($campo) {
case 'inmueble_estado_id':
$elementos = new InmuebleEstado();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->estado = $elemento;
}
break;
case 'inmueble_gestion_id':
$elementos = new InmuebleGestion();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->gestion = $elemento;
}
break;
case 'inmueble_tipo_id':
$elementos = new InmuebleTipo();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->tipo = $elemento;
}
break;
case 'provincia_id':
$elementos = new Provincia();
$elemento = $elementos->findById($this->data[$this->name][$campo]);
if (!empty($elemento)) {
$this->provincia = $elemento;
}
break;
case 'localidad_id':
$elementos = new Localidad();
if (!empty($this->data[$this->name]['provincia_id'])) { //provincia marcada
$elemento = $elementos->findByIdAndProvinciaId($this->data[$this->name][$campo], $this->data[$this->name]['provincia_id']);
} else {
$elemento = $elementos->findById($this->data[$this->name][$campo]);
}
if (!empty($elemento)) {
$this->localidad = $elemento;
}
break;
case 'zona_id':
$elementos = new Zona();
if (!empty($this->data[$this->name]['localidad_id'])) { //localidad marcada
$elemento = $elementos->findByIdAndLocalidadId($this->data[$this->name][$campo], $this->data[$this->name]['localidad_id']);
} else {
$elemento = $elementos->findById($this->data[$this->name][$campo]);
}
if (!empty($elemento)) {
$this->zona = $elemento;
}
break;
case 'eficiencia_energetica':
$elementos = Configure::read('Inmueble.eficiencias');
if (in_array($this->data[$this->name][$campo], $elementos)) {
$elemento = $elementos[$this->data[$this->name][$campo]];
}
break;
}
if (empty($elemento)) {
return false; //error
}
return true; //ok
}
public function checkZero($check) {
$elemento = null;
$campo = key($check);
if ((int) $this->data[$this->name][$campo] == 0) {
return false; //error
}
return true; //ok
}
public function checkMayorPrecio($check) {
$elemento = null;
$campo = key($check);
if (!empty($this->data[$this->name][$campo]) && (int) $this->data[$this->name][$campo] >= (int) $this->data[$this->name]['precio']) {
return false; //error
}
return true; //ok
}
public function checkPrecioAlquiler($check) {
if (!empty($this->data[$this->name]['inmueble_gestion_id']) && in_array((int) $this->data[$this->name]['inmueble_gestion_id'], Configure::read('Inmueble.gestionesAlquiler')) && empty($this->data[$this->name]['precio_alquiler'])) {
return false;
}
return true; //ok
}
public function afterSave($created, $options = array()) {
parent::afterSave($created, $options);
$entidad = $this->findById($this->id);
if (!empty($entidad)) {
$this->getVars($entidad); //obtenemos los valores de otras entidades para no repetir las consultas constantemente
$db = $this->getDataSource();
$this->updateAll(array(
'titulo' => $db->value($this->getTitulo($entidad), 'string'),
'titulo_corto' => $db->value($this->getTituloCorto($entidad), 'string'),
'busqueda' => $db->value($this->getBusqueda($entidad), 'string'),
'seo' => $db->value($this->getViviendaSeo($entidad), 'string'),
), array('Vivienda.id' => $this->id));
}
}
private function getVars($entidad) {
//Estado
if (empty($this->estado)) {
$elementos = new InmuebleEstado();
$elemento = $elementos->findById($entidad[$this->name]['inmueble_estado_id']);
if (!empty($elemento)) {
$this->estado = $elemento;
}
}
//Tipo de gestión
if (empty($this->gestion)) {
$elementos = new InmuebleGestion();
$elemento = $elementos->findById($entidad[$this->name]['inmueble_gestion_id']);
if (!empty($elemento)) {
$this->gestion = $elemento;
}
}
//Tipo de inmueble
if (empty($this->tipo)) {
$elementos = new InmuebleTipo();
$elemento = $elementos->findById($entidad[$this->name]['inmueble_tipo_id']);
if (!empty($elemento)) {
$this->tipo = $elemento;
}
}
//Provincia
if (empty($this->provincia)) {
$elementos = new Provincia();
$elemento = $elementos->findById($entidad[$this->name]['provincia_id']);
if (!empty($elemento)) {
$this->provincia = $elemento;
}
}
//Localidad
if (empty($this->localidad)) {
$elementos = new Localidad();
$elemento = $elementos->findById($entidad[$this->name]['localidad_id']);
if (!empty($elemento)) {
$this->localidad = $elemento;
}
}
//Zona
if (empty($this->zona)) {
$elementos = new Zona();
$elemento = $elementos->findById($entidad[$this->name]['zona_id']);
if (!empty($elemento)) {
$this->zona = $elemento;
}
}
}
private function getTitulo($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= $this->tipo['InmuebleTipo']['nombre'];
}
//Tipo de gestión
if (!empty($this->gestion)) {
$out .= ' en ' . strtolower($this->gestion['InmuebleGestion']['nombre']);
}
//Localidad
if (!empty($this->localidad)) {
$out .= " en {$this->localidad['Localidad']['nombre']}";
}
//Información extra (habitaciones, baños, superficie construida)
$extra = array();
if (!empty($entidad[$this->name]['num_habitaciones'])) {
$extra[] = "{$entidad[$this->name]['num_habitaciones']} habitaciones";
}
if (!empty($entidad[$this->name]['num_banos'])) {
$extra[] = "{$entidad[$this->name]['num_banos']} baños";
}
if (!empty($entidad[$this->name]['superficie_construida'])) {
$extra[] = "{$entidad[$this->name]['superficie_construida']} m<sup>2</sup>";
}
if (!empty($extra)) {
if (count($extra) == 1) {
$out .= ' con ' . implode(', ', $extra);
} else {
$extraLast = array_pop($extra);
$out .= ' con ' . implode(', ', $extra) . " y $extraLast";
}
}
//Precio
if (!empty($this->gestion['InmuebleGestion']) && in_array((int) $this->gestion['InmuebleGestion']['id'], Configure::read('Inmueble.gestionesAlquiler')) && !empty($entidad[$this->name]['precio_alquiler'])) {
$out .= " por " . number_format($entidad[$this->name]['precio_alquiler'], 0, ',', '.') . ' €/mes';
} else {
if (!empty($entidad[$this->name]['precio_oferta'])) {
$precio = $entidad[$this->name]['precio_oferta'];
} elseif (!empty($entidad[$this->name]['precio'])) {
$precio = $entidad[$this->name]['precio'];
}
if (!empty($precio)) {
$out .= " por " . number_format($precio, 0, ',', '.') . ' €';
}
}
return $out;
}
private function getTituloCorto($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= $this->tipo['InmuebleTipo']['nombre'];
//Localidad
if (!empty($this->localidad)) {
$out .= " en {$this->localidad['Localidad']['nombre']}";
}
}
return $out;
}
private function getBusqueda($entidad) {
$busqueda = array();
//Estado
if (!empty($this->estado)) {
$busqueda[] = $this->estado['InmuebleEstado']['nombre'];
}
//Tipo de gestión
if (!empty($this->gestion)) {
$busqueda[] = $this->gestion['InmuebleGestion']['nombre'];
}
//Tipo de inmueble
if (!empty($this->tipo)) {
$busqueda[] = $this->tipo['InmuebleTipo']['nombre'];
}
//Provincia
if (!empty($this->provincia)) {
$busqueda[] = $this->provincia['Provincia']['nombre'];
}
//Localidad
if (!empty($this->localidad)) {
$busqueda[] = $this->localidad['Localidad']['nombre'];
}
//Zona
if (!empty($this->zona)) {
$busqueda[] = $this->zona['Zona']['nombre'];
}
//Texto
if (!empty($entidad[$this->name]['texto'])) {
$busqueda[] = strip_tags($entidad[$this->name]['texto']);
}
//Campos adicionales
foreach (array('ascensor', 'calefaccion', 'garaje', 'jardin', 'parking', 'piscina', 'terraza', 'trastero') as $s) {
if ((bool) $entidad[$this->name][$s]) {
$busqueda[] = $s;
}
}
//Resto de campos para la búsqueda
$busqueda[] = $entidad[$this->name]['referencia'];
$busqueda[] = $entidad[$this->name]['titulo'];
$busqueda[] = $entidad[$this->name]['titulo_corto'];
return $this->generarBusqueda($busqueda);
}
private function getViviendaSeo($entidad) {
$out = '';
//Tipo de inmueble
if (!empty($this->tipo)) {
$out .= $this->tipo['InmuebleTipo']['nombre'];
//Tipo de gestión
if (!empty($this->gestion)) {
$out .= '-en-' . $this->gestion['InmuebleGestion']['nombre'];
}
}
//Localidad
if (!empty($this->localidad)) {
$out .= '-en-' . $this->localidad['Localidad']['nombre'];
}
//Zona
if (!empty($this->zona)) {
$out .= '-zona-' . $this->zona['Zona']['nombre'];
}
//Habitaciones
if (!empty($entidad[$this->name]['num_habitaciones'])) {
$out .= "-{$entidad[$this->name]['num_habitaciones']}-habitaciones";
}
//Referencia
if (!empty($entidad[$this->name]['referencia'])) {
$out .= "-{$entidad[$this->name]['referencia']}";
} else {
$out .= "-{$this->id}";
}
return strtolower(Inflector::slug($out, '-'));
}
}