diff options
Diffstat (limited to 'apps/mm/controllers')
-rw-r--r-- | apps/mm/controllers/Messages.class.php | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/apps/mm/controllers/Messages.class.php b/apps/mm/controllers/Messages.class.php new file mode 100644 index 0000000..d9decc9 --- /dev/null +++ b/apps/mm/controllers/Messages.class.php @@ -0,0 +1,98 @@ +<?php +require_once('Login.class.php'); +require_once('Auth.class.php'); +require_once('Database.class.php'); +require_once('Message.class.php'); +require_once('MimeMailParser.class.php'); + +Router::register('messages', 'Messages', 'index'); +Router::register('messages/index', 'Messages', 'index'); +Router::register('messages/*', 'Messages', 'message'); + +class Messages extends Controller { + private $msgdir; + + public function __construct() { + $db = Database::getInstance(); + $this->msgdir = $db->getSysConf('msgdir'); + } + + public function index($routed, $remainder) { + $parser = new MimeMailParser(); + $messages = array(); + $dh = opendir($this->msgdir); + while (($file = readdir($dh)) !== false) { + $path = $this->msgdir."/$file"; + if (is_file($path)) { + $parser->setPath($path); + + $date_string = $parser->getHeader('date'); + $date = strtotime($date_string); + if (!isset($messages[$date])) { + $messages[$date] = array(); + } + $messages[$date][] = + array('id'=>$file, + 'subject'=>$parser->getHeader('subject'), + 'from'=>$parser->getHeader('from')); + } + } + closedir($dh); + + $this->showView('messages/index', array('messages' => $messages)); + exit(); + } + + public function message($routed, $remainder) { + $uid = Login::isLoggedIn(); + if ($uid===false || !Auth::getInstance($uid)->isUser()) { + $this->http401($routed, $remainder); + return; + } + + $msg_id = $remainder[0];// We can trust the router that this is set + $msg = new Message($msg_id); + if ($msg === false) { + $this->http404($routed, $remainder); + return; + } + + @$part = $remainder[1]; + @$subpart = $remainder[2]; + + switch ($part) { + case '': + $this->showView('messages/frame', + array('msg'=>$msg)); + break; + case 'body': + require_once('Mime.class.php'); + header('Content-type: '.Mime::ext2mime(PAGE_EXT)); + $map = array('html'=>'html', + 'txt' =>'text'); + echo $msg->getMessageBody($map[PAGE_EXT]); + break; + case 'attachment': + $attachment_id = $subpart; + $attachments = $msg->getAttachments(); + $attachment = $attachments[$attachment_id]; + + $type = $attachment->getContentType(); + $filename = $attachment->getFilename(); + + header('Content-Type: '.$type); + header('Content-Disposition: attachment; filename='.$filename ); + while($bytes = $attachment->read()) { + echo $bytes; + } + break; + default: + array_push($routed, array_shift($remainder)); + $this->http404($routed, $remainder); + } + } + + public function http401($routed, $remainder) { + $this->showView('messages/401', array('uid'=>Login::isLoggedIn())); + } +}
\ No newline at end of file |