<?php    
// vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: 
/**
* Formulario para enviar correo desde consulta web
* Dominio publico.  2005. Sin garantias. 
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
*/


/**
 * Formulario para enviar correo desde consulta web
 */
require_once 'HTML/QuickForm/Controller.php';

require_once 'HTML/QuickForm/Action/Display.php';
require_once 'HTML/QuickForm/Action/Next.php';
require_once 'HTML/QuickForm/Action/Back.php';
require_once 'HTML/QuickForm/Action/Jump.php';
require_once 'HTML/QuickForm/header.php';
require_once 'HTML/QuickForm/date.php';
require_once 'HTML/QuickForm/text.php';

require_once "misc.php";
require_once "aut/conf.php";
require_once "aut/aut.php";

require_once 'DB/common.php';
require_once 'Mail.php';
require_once 'Mail/mime.php';
require_once 'confv.php';


/** 
 * Responde a envio del correo, enviando información encriptada como 
 * mensaje codificado y como adjunto.
 * Referencias: 
 * - Una versión inicial fue desarrollada con Mauricio Rivera 
 *   (mauricio.rivera.p@gmail.com) en 2004
 * - rechum/enviarmail de http://www.sf.net/projects/websafi
 *
 * PHP version 5
 *
 * @category  SIVeL
 * @package   SIVeL
 * @author    Vladimir Támara <vtamara@pasosdeJesus.org>
 * @copyright 2005 Dominio público. Sin garantías.
 * @license   http://creativecommons.org/licenses/publicdomain/ Dominio Público. Sin garantías.
 * @version   $Id: consulta_web_correo.php,v 1.29 2009/05/03 12:23:21 vtamara Exp $
 * @link      http://sivel.sf.net
 **/
class AccionEnviaCorreo extends HTML_QuickForm_Action
{

    /**
     * Ejecuta acción
     *
     * @param object &$page      Página
     * @param string $actionName Acción
     *
     * @return void
     */
    function perform(&$page, $actionName)
    {

        if (!isset($_POST['evita_csrf']) ||
            !isset($_SESSION['sin_csrf']) ||
            $_POST['evita_csrf'] != $_SESSION['sin_csrf']) {
                die("Datos enviados no pasaron verificación CSRF (" .
            $_SESSION['sin_csrf'] . ", " . $_POST['evita_csrf'] . ")");
        }

        encabezado_envia('Resultados');
        /* El siguiente pedazo pretende evitar posibles DoS 
         (pueden ser distribuidos) 
         pero tambien impide que dos personas envien informacion dentro de un 
         lapso de cierto tiempo (3 s?).  Si no se espera mucho publico para el 
         servicio puede resultar aceptable la limitación. 
         */
        $ultimo= 'ultimoenvio.txt';
        /* Manejo de archivos basado en ejemplo de 
            http://www.php.net/manual/en/function.fopen.php */

        clearstatcache();
        // prevent refresh from aborting file operations and hosing file
        ignore_user_abort(true);    
        $tiempoact = time();
        $tiempoult = 0;
        $fh = fopen($ultimo, 'r+b');
        if ($fh) {
            // don't do anything unless lock is successful
            if (flock($fh, LOCK_EX)) { 
                $tiempoult = fread($fh, 15);
                rewind($fh);
                fwrite($fh, $tiempoact);
                fflush($fh);
                /* better than truncating to 0 before writing, 
                 * per 04-Mar-2003 comment below
                 */
                ftruncate($fh, ftell($fh));    
                flock($fh, LOCK_UN);
            } else {
                echo "No pudo poner lock";
            }
            fclose($fh);
        } else {
            $fh = fopen($ultimo, 'w');
            if ($fh) {
                fwrite($fh, $tiempoact);
                fclose($fh);
            } else {
                echo "No pudo crear archivo $ultimo";
            }
        }
        ignore_user_abort(false);    // put things back to normal

        if ($tiempoact-$tiempoult < 6) {
            die("Por favor vuelva a intentar en unos segundos");
        }     

        $cuerposinenc = escapeshellarg(substr(varEscapa($_POST["correo"]), 
            0, 5000));
        //Evitamos inyección de encabezados
        $cuerposinenc = str_replace("\r", "", $cuerposinenc);
        $cuerposinenc = str_replace("\n", "", $cuerposinenc);

        $key = $GLOBALS['PALABRA_SITIO'];

        global $OPENSSL;

        //formula con bin2hex para enviarlo en le cuerpo del mensaje
        $adjuntoencriptado = 
            `/bin/echo $cuerposinenc | $OPENSSL bf -e -nosalt -k "$key"`;
        $cuerpo = bin2hex(chop($adjuntoencriptado));


        //formula sin bin2hex enviandolo como un adjunto
        $indice = varEscapa(substr($_POST["indice"], 0, 10));
        $indice = str_replace("\r", "", $indice);
        $indice = str_replace("\n", "", $indice);

        $recip1=$GLOBALS['receptor_correo'];
        $oheaders = array();
        $oheaders['To'] = $recip1;
        $oheaders['From'] = $GLOBALS['emisor_correo'];
        $oheaders['Subject']="Comentario Indice: $indice";

        $ocorreo = Mail::factory('smtp', array('host' => 'localhost'));
        @$r = $ocorreo->send($recip1, $oheaders, $cuerpo);
        if (PEAR::isError($r)) {
            die($r->getMessage());
        }

        //echo("Primer correo enviado.<br>");

        $anno = date("Y");
        $mes = date("m");
        $dia = date("d");
        $hora = date("H");
        $minutos = date("i");
        $segundos = date("s");

        $text_message = "Hola " .
            "\n\nEste mensaje es un comentario enviado desde el web \n";
        $text_message = $text_message . "viene encriptado con openssl.Dia: " .
            "$dia-$mes-$anno, hora $hora:$minutos:$segundos\n";

        $mime = new Mail_mime("\n");
        @$mime->setTXTBody($text_message);

        @$mime->addAttachment($adjuntoencriptado, 'application/octet-stream', 
            'adjunto-encriptado' . $anno . $mes . $dia, false);

        @$cuerpo_mime = $mime->get();
        @$mime_enc = $mime->headers($oheaders);

        @$r = $ocorreo->send($recip1, $mime_enc, $cuerpo_mime);
        if (PEAR::isError($r)) {
            die($r->getMessage());
        }

        echo "<p>Mensaje enviado.  Gracias por su aporte.\n</p>";
        echo $GLOBALS['pie_consulta_web_correo'];
        pie_envia();
    }
}

/** 
 * Formulario con correo.
 *
 * @category SIVeL
 * @package  SIVeL
 * @author   Vladimir Támara <vtamara@pasosdeJesus.org>
 * @license  http://creativecommons.org/licenses/publicdomain/ Dominio Público.
 * @link     http://sivel.sf.net/tec
 */
class ConsultaWebCorreo extends HTML_QuickForm_Page
{

    /**
     * Constructora
     *
     * @return void
     */
    function ConsultaWebCorreo()
    {
        $this->HTML_QuickForm_Page('consultaWebCorreo', 'post', '_self', null);
        $this->addAction('envia', new AccionEnviaCorreo());
    }

    /**
     * Construye formulario.
     *
     * @return object formulario
     */
    function buildForm()
    {
        $this->_formBuilt = true;
        $localizacion= varReqEscapa("m_localizacion");
        $indice = varReqEscapa("caso_id");
        $descripcion = varReqEscapa("caso_memo");
        $victimas = varReqEscapa("m_victimas");
        $tipificacion = varReqEscapa("m_tipificacion");
        $presponsables = varReqEscapa("m_presponsables");

        $e =& $this->addElement('header', null, 
            'Correo para complementar datos');
        $sel =& $this->addElement('textarea', 'correo',
            'Mensaje:');
        $sel->updateAttributes(array('wrap' => 'physical',
//          'cols'=\"50\" rows=\"20\"
            'onKeyDown' => 'textCounter(document.myForm.correo, ' .
                'document.myForm.remLen1, 10000)',
            'onKeyUp' => 'textCounter(document.myForm.correo, ' .
                    'document.myForm.remLen1, 10000)'
        ));
        $sel->setRows(20);
        $sel->setCols(50);
        $sel->setValue('Indice: ' . $indice . 
            'Localización: ' . $localizacion . 
            'Descripcion: ' . $descripcion . 
            'Responsables: ' . $presponsables . 
            'Victimas: ' . $victimas . 
            'Tipificacion: ' . $tipificacion);

        $sel =& $this->addElement('hidden', 'indice', $indice);
        $opch = array();
        $sel =& $this->createElement('submit',
            $this->getButtonName('envia'), 'Enviar correo');
        $opch[] =& $sel;

        $this->addGroup($opch, null, '', '&nbsp;', false);


        $_SESSION['sin_csrf'] = mt_rand(0, 1000);
        $this->addElement('hidden', 'evita_csrf', $_SESSION['sin_csrf']);

        $this->setDefaultAction('envia');
    }
}

/* No autenticamos porque pueden usarlo usuarios no autenticados */
$snru = nomSesion();
if (!isset($_SESSION) || session_name()!=$snru) {
    session_name($snru);
    session_start();
}

$controla =& new HTML_QuickForm_Controller('Correo', false);
$correo = new ConsultaWebCorreo();

$controla ->addPage($correo);

$controla->addAction('display', new HTML_QuickForm_Action_Display());
$controla->addAction('jump', new HTML_QuickForm_Action_Jump());
$controla->addAction('process', new AccionEnviaCorreo());

encabezado_envia('Correo para Complementar Datos', 
    $GLOBALS['cabezote_consulta_web_correo']);
$controla->run();
pie_envia($GLOBALS['pie_consulta_web_correo']);
    

?>
    
