<?php
ini_set('error_reporting', "-1");
ini_set('error_reporting', E_ALL);
/**
 * Description of Autentificacion
 *
 * @author yerko
 */

class Autentificacion {
    
    var $semilla;
    var $token;
    var $pkRuta;
    var $pkPass;
    var $pemRuta;
    var $keyRuta;
    
    public function __construct() {
        
    } 
    
    public function getServerString($sTipo){
        
        if (SLC_HAMBIENTE == 'PRODUCCION')
            $sServer='palena';//oficial SII
        else
            $sServer='maullin';//pruebas SII
        
        switch ($sTipo) {
            case 'crseed':{
                return 'https://'.$sServer.'.sii.cl/DTEWS/CrSeed.jws?WSDL';
            } 
            
            case 'tokenfromseed':{
                return 'https://'.$sServer.'.sii.cl/DTEWS/GetTokenFromSeed.jws?WSDL';
            }
            
            case 'upload_xml':{
                return 'https://'.$sServer.'.sii.cl/cgi_dte/UPL/DTEUpload';
            }
            
            case 'consultaestado':{
                return 'https://'.$sServer.'.sii.cl/DTEWS/QueryEstUp.jws?WSDL';
            }
            
            case 'estado_dte':{
                return 'https://'.$sServer.'.sii.cl/DTEWS/QueryEstDte.jws?WSDL';
            }
            
        }
    }
    
    public function getSeed() {
        $sem = exec("/usr/bin/python ./python/semilla.py 2>&1");

        if($sem=='') {
            echo "[X] ERROR: falta semilla."; 
            $this->semilla = 0 ;
        }
        else $this->semilla=$sem;
        
    }
    
    public function getToken() {
        $this->getSeed();
        if ($this->semilla == 0){
            exit();
        }
        else
        {
            // CREAR NODO GETTOKEN
            $xmlgettkn ='
            <getToken>
                    <item>
                    <Semilla>'.$this->semilla.'</Semilla>
                    </item>
            </getToken>';

            // TROZO DE XML PARA FIRMAR SEMILLA
            $signedinfo ='
            <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
                    <SignedInfo>
                            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                            <Reference URI="">
                                    <Transforms>
                                            <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                                    </Transforms>
                                    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                                    <DigestValue/>
                            </Reference>
                    </SignedInfo>
                    <SignatureValue/>
                    <KeyInfo>
                            <KeyValue>
                                    <RSAKeyValue>
                                            <Modulus/>
                                            <Exponent/>
                                    </RSAKeyValue>
                            </KeyValue>
                            <X509Data>
                                    <X509Certificate/>
                            </X509Data>
                    </KeyInfo>
            </Signature>';


            // AGREGAR NODO SIGNEDINFO
            $doc = new DOMDocument();

            $doc->loadXML($xmlgettkn);						// xml canonizado con semilla
            $f = $doc->createDocumentFragment();		// entrar a nodo getToken
            $f->appendXML($signedinfo);					// agregar signedinfo a getToken
            $doc->documentElement->appendChild($f);		
            $xmlsi = $doc->saveXML();					// crear xml con semilla y nodos para firmar

            // FIRMAR SEMILLA CON XMLSEC1 USANDO SHELL LINUX                
            $rnd = rand(1000000,9999999);				// nombre de archivo aleatorio
            $xmlsinfirma = $rnd.".xml";					// nombre de xml sin firmar
            $xmlconfirma = $rnd."-sig.xml";				// nombre de xml firmado

            // guardar xml a un archivo
            if(!file_put_contents($xmlsinfirma, $xmlsi, LOCK_EX)) {
                    echo "ERROR: file_put_contents: no se puede escribir archivo ($xmlsinfirma)"; exit();
            }

            // comando para firmar con xmlsec1 (no seguro)
            $cmd = 'xmlsec1 --sign --privkey-pem '.$this->keyRuta.','.$this->pemRuta.' --pwd '.$this->pkPass.' '.$xmlsinfirma.' > '.$xmlconfirma; //.'; cat semilla-sig.xml; rm semilla-sig.xml';
            
            shell_exec($cmd);							// ejecutar comando

            // leer archivo xml firmado
            $this -> token = exec("/usr/bin/python ./python/gettoken.py \"$xmlconfirma\" 2>&1");
            
            if($this->token=="") {
                            echo "[X] ERROR: no hay token."; exit(); // error: no retorna valor
            }
            
            // borrar archivos temporales
            unlink($xmlconfirma);
            unlink($xmlsinfirma);
        }
        
        
    }
    
}
