Beispiel #1
0
 /**
  * @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');
 }