'Anonymous ', 'sig' => '', 'org' => '', 'customhdr' =>'', 'display' => 0, 'lastnews' => 0, 'locale' => 'fr_FR', 'subscribe' => array()); var $state = Array('group' => null, 'artid' => null, 'action' => null); var $nntp; var $groups; var $newgroups; var $post; var $spool; var $get; function Banana() { $this->_require('NetNNTP'); setlocale(LC_ALL, $this->profile['locale']); $this->nntp = new nntp($this->host); if (!$this->nntp || !$this->nntp->valid) { $this->nntp = null; } } /** Run Banana * @param STRING class Name of the class to use * @param ARRAY myget If defined is used instead of get */ function run($class = 'Banana', $myget = null) { global $banana; Banana::_require('misc'); $banana = new $class(); if (is_null($myget)) { $banana->get = $_GET; } else { $banana->get = $myget; } if (!$banana->nntp) { $banana->state['page'] = 'error'; return makeTable('

'._b_('Impossible de contacter le serveur').'

'); } $group = empty($banana->get['group']) ? null : $banana->get['group']; if (!is_null($group) && isset($banana->grp_pattern) && !preg_match('/' . $banana->grp_pattern . '/', $group)) { $banana->state['page'] = 'error'; return makeTable('

' . $group . _b_(' : ce newsgroup n\'existe pas ou vous n\'avez pas l\'autorisation d\'y accéder') . '

'); } $artid = empty($banana->get['artid']) ? null : strtolower($banana->get['artid']); $partid = !isset($banana->get['part']) ? -1 : $banana->get['part']; $action = !isset($banana->get['action']) ? null : $banana->get['action']; $banana->state = Array ('group' => $group, 'artid' => $artid, 'action' => $action); if (is_null($group)) { if (isset($banana->get['subscribe'])) { $banana->state['page'] = 'subscribe'; return makeTable($banana->action_listSubs()); } elseif (isset($_POST['validsubs'])) { $banana->action_saveSubs(); } $banana->state['page'] = 'forums'; return makeTable($banana->action_listGroups()); } elseif (is_null($artid)) { if (isset($_POST['action']) && $_POST['action'] == 'new') { return makeTable($banana->action_doFup($group, isset($_POST['artid']) ? intval($_POST['artid']) : -1)); } elseif ($action == 'new') { $banana->state['page'] = 'action'; return makeTable($banana->action_newFup($group)); } else { $banana->state['page'] = 'group'; return makeTable($banana->action_showThread($group, isset($banana->get['first']) ? intval($banana->get['first']) : 1)); } } else { if (isset($_POST['action']) && $_POST['action']=='cancel') { $res = $banana->action_cancelArticle($group, $artid); } else { $res = ''; } if (!is_null($action)) { $banana->state['page'] = 'action'; switch ($action) { case 'cancel': $res .= $banana->action_showArticle($group, $artid, $partid); if ($banana->post->checkcancel()) { $form = '

'._b_('Voulez-vous vraiment annuler ce message ?').'

' . '

' . '' . '' . '

'; return makeTable($form . $res); } return makeTable("" . $res); case 'new': return makeTable($banana->action_newFup($group, $artid)); } } if (isset($banana->get['pj'])) { $view = false; if ($action == 'view') { $view = true; } $att = $banana->action_getAttachment($group, $artid, $banana->get['pj'], $view); return makeTable($res . $att); } $banana->state['page'] = 'message'; return makeTable($banana->action_showArticle($group, $artid, $partid)); } } /**************************************************************************/ /* actions */ /**************************************************************************/ function action_saveSubs() { return; } function action_listGroups() { $this->_newGroup(); $res = $this->groups->to_html(); if (count($this->newgroups->overview)) { $res .= '

'._b_('Les forums suivants ont été créés depuis ton dernier passage :').'

'; $res .= $this->newgroups->to_html(); } $this->nntp->quit(); return $res; } function action_listSubs() { $this->_require('groups'); $this->groups = new BananaGroups(BANANA_GROUP_ALL); $res = $this->groups->to_html(true); $this->nntp->quit(); return $res; } function action_showThread($group, $first) { if (!$this->_newSpool($group, $this->profile['display'], $this->profile['lastnews'])) { return '

'._b_('Impossible charger la liste des messages de ') . $group . '

'; } if ($first > count($this->spool->overview)) { $first = count($this->spool->overview); } $first = $first - ($first % $this->tmax) + 1; $pages = displayPages($first); $res = $pages . $this->spool->to_html($first, $first+$this->tmax) . $pages; $this->nntp->quit(); return $res; } function action_showArticle($group, $id, $part) { if (!$this->_newSpool($group, $this->profile['display'], $this->profile['lastnews'])) { return '

'._b_('Impossible charger la liste des messages de ') . $group . '

'; } if (!$this->_newPost($id)) { if ($this->nntp->lasterrorcode == "423") { $this->spool->delid($id); } $this->nntp->quit(); return '

'._b_('Impossible d\'accéder au message. Le message a peut-être été annulé').'

'; } $res = $this->post->to_html($part); $this->nntp->quit(); return $res; } function action_getAttachment($group, $id, $pjid, $action) { if (!$this->_newSpool($group, $this->profile['display'], $this->profile['lastnews'])) { return '

'._b_('Impossible charger la liste des messages').'

'; } if (!$this->_newPost($id)) { if ($this->nntp->lasterrorcode == "423") { $this->spool->delid($id); } $this->nntp->quit(); return '

'._b_('Impossible d\'accéder au message. Le message a peut-être été annulé').'

'; } $this->nntp->quit(); if ($this->post->get_attachment($pjid, $action)) { return ""; } else { return '

'._b_('Impossible d\'accéder à la pièce jointe.').'

'; } } function action_cancelArticle($group, $id) { if (!$this->_newSpool($group, $this->profile['display'], $this->profile['lastnews'])) { return '

'._b_('Impossible charger la liste des messages').'

'; } if (!$this->_newPost($id)) { return '

'._b_('Impossible de trouver le message à annuler').'

'; } $mid = array_search($id, $this->spool->ids); if (!$this->post->checkcancel()) { return '

'._b_('Vous n\'avez pas les permissions pour annuler ce message').'

'; } $msg = 'From: '.$this->profile['name']."\n" . "Newsgroups: $group\n" . "Subject: cmsg $mid\n" . $this->custom . "Control: cancel $mid\n" . "\n" . "Message canceled with Banana"; if ($this->nntp->post($msg)) { $ndx = $this->spool->getndx($artid) - 1; if ($ndx > 50) { $ndx = 0; } $this->spool->delid($id); $this->nntp->quit(); redirectInBanana(Array('group' => $group, 'first' => $ndx)); } else { return '

'._b_('Impossible d\'annuler le message').'

'; } } function action_newFup($group, $id = -1) { $subject = $body = ''; $target = $group; if (@$_POST['action'] == 'new') { $subject = $_POST['subject']; $body = $_POST['body']; $target = $_POST['newsgroups']; $followup = $_POST['followup']; $this->state['page'] = 'action'; $this->state['group'] = $group; $this->state['action'] = 'new'; if ($id != -1) { $this->state['artid'] = $id; } } elseif ($id > 0) { $this->nntp->group($group); if ($this->_newPost($id)) { $subject = 'Re: ' . preg_replace("/^re\s*:\s*/i", '', $this->post->headers['subject']); $body = to_entities(utf8_encode($this->post->name." "._b_("a écrit"))." :\n" . wrap($this->post->get_body(), "> ") . ($this->profile['sig'] ? "\n\n-- \n". $this->profile['sig'] : '')); $target = isset($this->post->headers['followup-to']) ? $this->post->headers['followup-to'] : $this->post->headers['newsgroups']; $followup = null; } } else { $targe = $group; $subject = $followup = null; $body = $this->profile['sig'] ? "\n\n-- \n". $this->profile['sig'] : ''; } $this->nntp->quit(); $html = '
' . '' . '' . '' . '' . '' . '' . '' . '' . '' . '' . '' . '' . '' . ''; if ($this->can_attach) { $html .= '' . ''; } $html .= '' . '
' . _b_('En-têtes') . '
' . _b_('Nom') . '' . htmlentities($this->profile['name']) . '
' . _b_('Sujet') . '
' . _b_('Forums') . '
' . _b_('Suivi à') . '
' . _b_('Organisation') . '' . $this->profile['org'] . '
' . _b_('Corps') . '
' . _b_('Pièce jointe') . '
' . '' . '
'; if ($id != -1) { $html .= ''; } $html .= '' . '
'; return $html; } function action_doFup($group, $artid = -1) { if ( ! (is_utf8($_POST['subject']) && is_utf8($_POST['body']))) { foreach(Array('subject', 'body') as $key) { $_POST[$key] = utf8_encode($_POST[$key]); } } $forums = preg_split('/\s*(,|;)\s*/', $_POST['newsgroups']); $fup = $_POST['followup']; if (sizeof($forums) > 1) { if (empty($fup)) { $fup = $forums[0]; } } $to = implode(',', $forums); if (!$this->_newSpool($group, $this->profile['display'], $this->profile['lastnews'])) { return '

'._b_('Impossible charger la liste des messages').'

'; } $body = preg_replace("/\n\.[ \t\r]*\n/m", "\n..\n", $_POST['body']); $msg = 'From: ' . $this->profile['name'] . "\n" . "Newsgroups: ". $to . "\n" . "Subject: " . headerEncode($_POST['subject'], 128) . "\n" . (empty($this->profile['org']) ? '' : "Organization: {$this->profile['org']}\n") . (empty($fup) ? '' : 'Followup-To: ' . $fup . "\n"); if ($artid != -1) { $this->_require('post'); $post = new BananaPost($artid); if (!$post || !$post->valid) { return '

'._b_('Impossible charger le message d\'origine').'

'; } $refs = ( isset($post->headers['references']) ? $post->headers['references']." " : "" ); $msg .= "References: $refs{$post->headers['message-id']}\n"; } $body_headers = $this->custom_plain; $body = wrap($body, ""); // include attachment in the body $uploaded = $this->_upload('newpj'); switch ($uploaded['error']) { case UPLOAD_ERR_OK: $this->custom = $this->custom_mp.$this->custom; $body = $this->_make_part($body_headers, $body); $file_head = 'Content-Type: '.$uploaded['type'].'; name="'.$uploaded['name']."\"\n" . 'Content-Transfer-Encoding: '.$uploaded['encoding']."\n" . 'Content-Disposition: attachment; filename="'.$uploaded['name']."\"\n"; $body .= $this->_make_part($file_head, $uploaded['data']); $body .= "\n--".$this->boundary.'--'; break; case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: return '

'._b_('Fichier trop gros pour être envoyé : ') .$uploaded['name'].'

'.$this->action_showThread($group, $artid); case UPLOAD_ERR_PARTIAL: return '

'._b_('Erreur lors de l\'upload de ') .$uploaded['name'].'

'.$this->action_showThread($group, $artid); case UPLOAD_ERR_NO_FILE: return '

'._b_('Le fichier spécifié n\'existe pas : ') .$uploaded['name'].'

'.$this->action_showThread($group, $artid); case UPLOAD_ERR_NO_TMP_DIR: return '

'._b_('Une erreur est survenue sur le serveur lors de l\'upload de ') .$uploaded['name'].'

'.$this->action_showThread($group, $artid); default: $this->custom = $body_headers.$this->custom; } // finalise and post the message $msg .= $this->custom.$this->profile['customhdr']."\n".$body; if ($this->nntp->post($msg)) { $dir = Array('group' => $group); if ($artid != -1) { $dir['artid'] = $artid; } redirectInBanana($dir); } else { return '

' . _b_('Impossible de poster le message. Le serveur a retourné l\'erreur :') . '

' . '
' . utf8_encode($this->nntp->lasterrortext) .'
' . $this->action_newFup($group, $artid); } } /**************************************************************************/ /* Private functions */ /**************************************************************************/ function _newSpool($group, $disp=0, $since='') { $this->_require('spool'); if (!$this->spool || $this->spool->group != $group) { $this->spool = new BananaSpool($group, $disp, $since); if (!$this->spool || !$this->spool->valid) { $this->spool = null; return false; } } if (count($this->profile['subscribe']) > 0) { $this->_newGroup(false); } return true; } function _newPost($id) { $this->_require('post'); $this->post = new BananaPost($id); if (!$this->post || !$this->post->valid) { $this->post = null; return false; } return true; } function _newGroup($showNew = true) { $this->_require('groups'); $this->groups = new BananaGroups(BANANA_GROUP_SUB); if ($showNew && $this->groups->type == BANANA_GROUP_SUB) { $this->newgroups = new BananaGroups(BANANA_GROUP_NEW); } } function _require($file) { require_once (dirname(__FILE__).'/'.$file.'.inc.php'); } function _upload($file) { if ($_FILES[$file]['name'] == "") { return Array( 'error' => -1 ); } // upload $_FILES[$file]['tmp_name']; // test if upload is ok $file = $_FILES[$file]; if ($file['size'] == 0 || $file['error'] != 0) { if ($file['error'] == 0) { $file['error'] = -1; } return $file; } // adding custum data $mime = rtrim(shell_exec('file -bi '.$file['tmp_name'])); //Because mime_content_type don't work :( $encod = 'base64'; if (preg_match("@([^ ]+/[^ ]+); (.*)@", $mime, $format)) { $mime = $format[1]; $encod = $format[2]; } $data = fread(fopen($file['tmp_name'], 'r'), $file['size']); if ($encod == 'base64') { $data = chunk_split(base64_encode($data)); } $file['name'] = basename($file['name']); $file['type'] = $mime; $file['encoding'] = $encod; $file['data'] = $data; return $file; } function _make_part($headers, $body) { return "\n--".$this->boundary."\n".$headers."\n".$body; } } // vim:set et sw=4 sts=4 ts=4 ?>