/** * @ignore Metodo interno que llama la solicitud web para obtener las configuraciones del servicio */ public static function _get_opciones($id, $clase) { $seguro = false; self::cargar_ini($id); $directorio = toba_instancia::get_path_instalacion_proyecto(toba::proyecto()->get_id()) . "/servicios_serv/{$id}"; if (isset(self::$ini)) { chdir($directorio); if (self::$ini->existe_entrada('conexion')) { self::$opciones = self::$ini->get_datos_entrada('conexion'); } if (self::$ini->existe_entrada('certificado')) { $seguridad = array("sign" => true, "encrypt" => true, "algorithmSuite" => "Basic256Rsa15", "securityTokenReference" => "IssuerSerial"); $policy = new WSPolicy(array("security" => $seguridad)); //Agrego los certificados manualmente if (!file_exists(self::$ini->get("certificado", "clave_servidor"))) { throw new toba_error("El archivo " . self::$ini->get("certificado", "clave_servidor") . " no existe"); } $clave_privada = ws_get_cert_from_file(self::$ini->get("certificado", "clave_servidor")); if (!file_exists(self::$ini->get("certificado", "cert_servidor"))) { throw new toba_error("El archivo " . self::$ini->get("certificado", "cert_servidor") . " no existe"); } $certificado_servidor = ws_get_cert_from_file(self::$ini->get("certificado", "cert_servidor")); $certificados = array("privateKey" => $clave_privada, "certificate" => $certificado_servidor); $security = new WSSecurityToken($certificados); self::$opciones['policy'] = $policy; self::$opciones['securityToken'] = $security; $seguro = true; } //Averiguo los IDs de firmas definidos foreach (self::$ini->get_entradas() as $entrada => $valores) { if (strpos($entrada, '=')) { if (file_exists($valores['archivo'])) { $pares = array(); foreach (explode(",", $entrada) as $par) { list($clave, $valor) = explode('=', trim($par)); $pares[$clave] = $valor; } self::agregar_mapeo_firmas(realpath($valores['archivo']), $pares, $valores['fingerprint']); } else { throw new toba_error("El archivo {$valores['archivo']} no existe"); } } } } self::$opciones = array_merge(self::$opciones, call_user_func(array($clase, 'get_opciones'))); return self::$opciones; }
/** * Asocia el proyecto y servicio con el nombre del archivo que contiene la clave publica * @param directorio * @param array $headers * @param cert_cliente */ function generar_configuracion_servidor($cert_cliente, $headers = array()) { $config = self::get_ini_server($this->proyecto, $this->get_id()); if (!$config->existe_entrada('certificado')) { $cert = array(); $cert['clave_servidor'] = '../../privada.key'; //Se utiliza la clave de todo el proyecto $cert['cert_servidor'] = '../../publica.crt'; //Se utiliza el cert de todo el proyecto $config->agregar_entrada('certificado', $cert); } //Armo ID de cliente $nombre = self::generar_id_entrada_cliente($headers); //Guarda el certificado del cliente $directorio = $this->get_dir_instalacion_servidor(); $nombre_archivo = toba_manejador_archivos::nombre_valido(str_replace('=', '_', $nombre)); copy($cert_cliente, $directorio . "/{$nombre_archivo}.crt"); $datos = array(); $datos['archivo'] = "./{$nombre_archivo}.crt"; $datos['fingerprint'] = sha1(toba_servicio_web::decodificar_certificado($directorio . "/{$nombre_archivo}.crt")); if (!$config->existe_entrada($nombre)) { $config->agregar_entrada($nombre, $datos); } else { $config->set_datos_entrada($nombre, $datos); } if (!$config->existe_entrada('general', 'activo')) { $config->agregar_entrada('general', array('activo' => '0')); //Desactivo el WS por defecto } $config->guardar(); }
function procesar() { toba::logger_ws()->debug('Servicio Llamado: ' . $this->info['basica']['item']); toba::logger_ws()->set_checkpoint(); set_error_handler('toba_logger_ws::manejador_errores_recuperables', E_ALL); $this->validar_componente(); //-- Pide los datos para construir el componente, WSF no soporta entregar objetos creados $clave = array(); $clave['proyecto'] = $this->info['objetos'][0]['objeto_proyecto']; $clave['componente'] = $this->info['objetos'][0]['objeto']; list($tipo, $clase, $datos) = toba_constructor::get_runtime_clase_y_datos($clave, $this->info['objetos'][0]['clase'], false); agregar_dir_include_path(toba_dir() . '/php/3ros/wsf'); $opciones_extension = toba_servicio_web::_get_opciones($this->info['basica']['item'], $clase); $wsdl = strpos($_SERVER['REQUEST_URI'], "?wsdl") !== false; $sufijo = 'op__'; $metodos = array(); $reflexion = new ReflectionClass($clase); foreach ($reflexion->getMethods() as $metodo) { if (strpos($metodo->name, $sufijo) === 0) { $servicio = substr($metodo->name, strlen($sufijo)); $prefijo = $wsdl ? '' : '_'; $metodos[$servicio] = $prefijo . $metodo->name; } } $opciones = array(); $opciones['serviceName'] = $this->info['basica']['item']; $opciones['classes'][$clase]['operations'] = $metodos; $opciones = array_merge($opciones, $opciones_extension); $this->log->debug("Opciones del servidor: " . var_export($opciones, true), 'toba'); $opciones['classes'][$clase]['args'] = array($datos); toba::logger_ws()->set_checkpoint(); $service = new WSService($opciones); $service->reply(); $this->log->debug("Fin de servicio web", 'toba'); }