<?php

if ( ! @include_once( './mainfile.php' ) ) { exit( '!! INCLUDE ERROR. ACCESS DENIED !!' ); }
error_reporting( _E_VALUE );


/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | myPHPNuke Version 188_8 RC2                                          |
// +----------------------------------------------------------------------+
// | License: GNU/GPL - http://www.gnu.org/copyleft/gpl.html              |
// +----------------------------------------------------------------------+
// | Support: http://myphpnuke.com/                                       |
// +----------------------------------------------------------------------+
// | Author: myPHPNuke Dev Team                                           |
// +----------------------------------------------------------------------+
// | Copyright: © 2001-2004 myPHPNuke Dev Team                            |
// +----------------------------------------------------------------------+
// $Id: decodemessage.inc.php,v 1.5.2.2 2004/04/18 12:45:41 ajvwaay Exp $



  #########################################################
  #  Class DecodeMessage: Mime message decoder      #
  #  by AKAN NKWEINI                   #
  #  akan@p3mail.com                   #
  #  http://www.p3mail.com                #
  #########################################################
class DecodeMessage{
  var $header;
  var $body;
  var $fullmessage;
  var $auto_decode = true;
  var $attachment_path;
  var $choose_best = true;
  var $best_format = "text/html";


  function InitHeaderAndBody($header, $body) {
    $this->header = $header;
    $this->body = $body;
    $this->fullmessage = chop($header)."\t\n\t\n".ltrim($body);
  }
  function Body() {
    return trim($this->body);
  }
  function InitMessage($msg) {
    $i = 0;
    $m = "";
    $messagebody = "";
    $line = explode("\n",trim($msg));
    for ($j=0;$j<count($line);$j++) {
      if (chop($line[$j]) == ""  AND $i < 1) :
        $this->header = $m;
        $i++;
      endif;
      if ($i > 0)
        $messagebody .= $line[$j]."\n";
      $m .= $line[$j]."\n";
    }
    $this->body = $messagebody;
    $this->fullmessage = $msg;
    global $download_dir;
    $this->attachment_path = $download_dir;
  }

  function Headers($field="") {
    if ($field == "") :
      return $this->header;
    else :
      $hd = "";
      $field = $field.":";
      $start = 0;
      $j=0;
      $header = eregi_replace("\r", "\n", $this->header);
      $p = explode("\n", $header);
      do {
        for ($i=$start;$i<count($p);$i++) {
          if (ereg("^($field)", $p[$i]))  :
              $position = $i;
              $hd .= ereg_replace("$field", "",$p[$i]);
              break;
            endif;
        }

//        if (ereg("^($field)", $p[$i]))  :
        if (isset( $p[$i] ) && ereg("^($field)", $p[$i]))  :
          for ($i=$position+1;$i<count($p);$i++) {
            $tok = strtok($p[$i], " ");
            if (ereg(":$", $tok) AND (!(eregi("^($field)", $tok))))
              break;
            $hd .= ereg_replace("$field", "",$p[$i]);
          }
          $start=$i+1;
        endif;
      } while ($j++ < count($p));
    return $hd;
    endif;
  }

  function ContentType() {
    $c = $this->Headers("Content-Type");
    $ct = ereg_replace("[[:space:]]", "", $c);
    if (!(ereg(";", $ct))) :
      $content["type"] = trim($ct);
    else :
      $p = explode (";", $ct);
      for ($i=0;$i<count($p);$i++) {
        if (eregi("^(text)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(multipart)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(application)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(message)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(image)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(audio)", $p[$i])) :
          $content["type"] = $p[$i];
        elseif (eregi("^(charset)", $p[$i])) :
          $content["charset"] = eregi_replace("(charset=)|(\")", "", $p[$i]);
        elseif (eregi("^(report-type)", $p[$i])) :
          $content["report-type"] = eregi_replace("(report-type=)|(\")", "", $p[$i]);
        elseif (eregi("^(type)", $p[$i])) :
          $content["subtype"] = eregi_replace("(type=)|(\")", "", $p[$i]);
        elseif (eregi("^(boundary)", $p[$i])) :
          $content["boundary"] = eregi_replace("(boundary=)|(\")", "", $p[$i]);
        elseif (eregi("^(name)", $p[$i])) :
          $content["name"] = eregi_replace("(name=)|(\")", "", $p[$i]);
        elseif (eregi("^(access-type)", $p[$i])) :
          $content["access-type"] = eregi_replace("(access-type=)|(\")", "", $p[$i]);
        elseif (eregi("^(site)", $p[$i])) :
          $content["site"] = eregi_replace("(site=)|(\")", "", $p[$i]);
        elseif (eregi("^(directory)", $p[$i])) :
          $content["directory"] = eregi_replace("(directory=)|(\")", "", $p[$i]);
        elseif (eregi("^(mode)", $p[$i])) :
          $content["mode"] = eregi_replace("(mode=)|(\")", "", $p[$i]);
        endif;
      }
    endif;
    return $content;
  }
  function ContentDisposition() {
    $c = $this->Headers("Content-Disposition");
    $c = ereg_replace("[[:space:]]", "", $c);
    if (!(ereg(";", $c))) :
      $cd["type"] = $c;
    else :
      $p = explode(";", $c);
      for ($i=0;$i<count($p);$i++) {
        if (eregi("^(inline)", $p[$i])) :
          $cd["type"] = $p[$i];
        elseif (eregi("^(attachment)", $p[$i])) :
          $cd["type"] = $p[$i];
        elseif(eregi("^(filename)", $p[$i])) :
          $cd["filename"] = eregi_replace("(filename=)|(\")", "", $p[$i]);
        endif;
      }
    endif;
    return $cd;
  }
  function my_array_shift(&$array) {
    reset($array);
    $key = key($array);
    $val = current($array);
    unset($array[$key]);
    return $val;
  }
  function my_array_compact(&$array) {
    while (list($key, $val) = each($array)) :
        if (chop($val) == '')
          unset($array[$key]);
    endwhile;
  }
   function my_in_array($value, $array) {
    while (list($key, $val) = each($array)) :
        if (strcmp($value, $val) == 0)
          return true;
    endwhile;
    return false;
  }
  function Result() {
    $is_multipart_alternative = false;
    $is_multipart_related = false;
    $found_best = false;

    $messages = array();

    do {
      $next_message = "";
      do {
        $next_multipart = "";
        $content = $this->ContentType();
        $cd = $this->ContentDisposition();
        if ( eregi("^(multipart)", $content["type"]) ) :
          if ( eregi("multipart/alternative", $content["type"]) ) :
            $is_multipart_alternative = true;
          endif;
          if ( eregi("multipart/related", $content["type"]) ) :
            $is_multipart_related = true;
          endif;
          $boundary = "--".$content["boundary"];
          $p = explode($boundary, $this->body);

          $contentid = array();

          for ($i=0;$i<count($p);$i++) {
            $this->InitMessage($p[$i]);
            $content = $this->ContentType();
            $this->ContentDisposition();

            if ($is_multipart_related AND (chop($this->Headers("Content-ID")) != '')) :
              $cont["id"] = ereg_replace("[<>]","", $this->Headers("Content-ID"));
              $cont["name"] = $content["name"];
              $contentid[] = $cont;
              unset($cont);
            endif;
            if (eregi("multipart", $content["type"])) :
              $multiparts[] = $p[$i];
            elseif (eregi("message", $content["type"])) :
              $messages[] = $p[$i];
            elseif ($this->choose_best AND eregi("text/plain", $content["type"]) AND $is_multipart_alternative  AND !($found_best)) :
              $best = $p[$i];
            elseif ($this->choose_best AND eregi($this->best_format, $content["type"]) AND $is_multipart_alternative ) :
              if (eregi("[[:alpha:]]", chop($p[$i]))) :
                $best = $p[$i];
                $found_best = true;
              endif;
            elseif (chop($content["type"]) != '' AND chop($this->body) !='') :
              $parts[] = $p[$i];
            endif;
            #echo "<pre>($i)###".htmlspecialchars($this->header)."</pre>--###<hr>";
          }
//          if (chop($best) != '') :
          if (isset( $best ) && chop($best) != '') :
            $parts[] = $best;
          endif;
        else :
          if (eregi("(message)", $content["type"])) :
            $messages[] = $this->fullmessage;
          elseif (chop($this->body) != '') :
            $parts[] = $this->fullmessage;
          endif;
        endif;
        unset($is_multipart_alternative);
        unset($best);
        unset($found_best);

//        if (count($multiparts) > 0) :
        if (isset( $multiparts) && count($multiparts) > 0) :
          $next_multipart = $this->my_array_shift($multiparts);
          $this->InitMessage($next_multipart);
        endif;
      } while ($next_multipart != "");

//        if (chop($parts) != '') :
        if (is_array($parts) && !empty($parts)) :
          for ($i=0;$i<count($parts);$i++) {;
            $this->InitMessage($parts[$i]);
            $ct = $this->ContentType();
            $cd = $this->ContentDisposition();

            if (eregi("text/html", $ct["type"]) AND count($contentid > 0)) :

              for ($k=0;$k<count($contentid);$k++) {
                $filelocation = $this->attachment_path."/".$contentid[$k]["name"];
                $cid = $contentid[$k]["id"];
                $cid = ereg_replace("[[:space:]]", "", $cid);
                $this->body = str_replace("cid:", "", $this->body);
                $this->body = str_replace($cid, $filelocation, $this->body);
              }
            endif;
            if ($this->auto_decode
              AND eregi("attachment", $cd["type"])
              OR eregi("base64", $this->Headers("Content-Transfer-Encoding"))
              ) :
                $filename = chop($ct["name"]) ? $ct["name"] : $cd["filename"];
                if (eregi("base64", $this->Headers("Content-Transfer-Encoding"))) :
                  $file = base64_decode($this->body);
                elseif (eregi("quoted-printable", $this->Headers("Content-Transfer-Encoding"))) :
                  $file = quoted_printable_decode($this->body);
                  $file = ereg_replace("(=\n)", "", $this->body);
                  $file = $this->body;
                elseif (eregi("7bit", $this->Headers("Content-Transfer-Encoding"))) :
                  $file = $this->body;
                endif;
                $filepath = $this->attachment_path."/".$filename;
                @unlink($filepath);
                if (chop($filename != '')) :
                  $fp = @fopen($filepath, "a+b") OR die("Cannot open file \"$filepath\"");
                  fwrite($fp, $file);
                  fclose($fp);
                  if (eregi("attachment", $cd["type"]) OR eregi("inline", $cd["type"])) :
                    #echo "\n<p><a href=\"$filepath\">$filename</a><p>";
                    $decoded_part["attachments"] = $filename;
                  endif;
                endif;
            endif;
            if (eregi("^(text)", $ct["type"] )
                AND !(eregi("text/html", $ct["type"] ))
                AND !(eregi("attachment", $cd["type"] ))
                OR (chop($ct["type"]) == "")
               ) :
              $decoded_part["body"]["type"] = $ct["type"];
              $decoded_part["body"]["body"] = $this->body;
            elseif (eregi("text/html", $ct["type"] ) AND !(eregi("attachment", $cd["type"] ))) :
              $decoded_part["body"]["type"] = $ct["type"];
              $decoded_part["body"]["body"] = $this->body;
              #echo "<pre>($parts_count)###".htmlspecialchars($ct["type"])."</pre>--###<hr>";

            endif;
             $dp[] = $decoded_part;
             unset($decoded_part);
           }

        endif;
        $message[] = $dp;
        unset($dp);
        unset($is_multpart_related);
        unset($contentid);
        unset($parts);

//        if (count($messages) > 0) :

        if (is_array( $messages ) && !empty( $messages )) :
          $this->my_array_compact($messages);
          $next_message = $this->my_array_shift($messages);
          $this->InitMessage($next_message);
          $this->InitMessage($this->body);
        endif;
    } while ($next_message != "");
    return $message;
  }
  function MessageID() {
    return ereg_replace("[<>]","",$this->Headers("Message-ID"));
  }
}

?>
