'Anonymous ', 'sig' => '', 'org' => '', 'customhdr' =>'', 'display' => 0, 'lastnews' => 0, 'locale' => 'fr_FR', 'subscribe' => array()); var $state = Array('group' => null, 'artid' => null); var $nntp; var $groups; var $newgroups; var $post; var $spool; 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; } } function run($class = 'Banana') { global $banana; Banana::_require('misc'); $banana = new $class(); if (!$banana->nntp) { return '

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

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

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

' . "

" . '' . '' . '

'; return $form.$res; } return $res; case 'new': return $banana->action_newFup($group, $artid); } } if (isset($_GET['pj'])) { $action = false; if (isset($_GET['action']) && $_GET['action'] == 'view') { $action = true; } $att = $banana->action_getAttachment($group, $artid, $_GET['pj'], $action); if ($att != "") { return $res.$att; } return ""; } return $res . $banana->action_showArticle($group, $artid, $partid); } } /**************************************************************************/ /* actions */ /**************************************************************************/ function action_saveSubs() { return; } function action_listGroups() { $this->_newGroup(); $cuts = displayshortcuts(); $res = '

'._b_('Les forums de Banana').'

'.$cuts.$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.$cuts; } function action_listSubs() { $this->_require('groups'); $this->groups = new BananaGroups(BANANA_GROUP_ALL); $cuts = displayshortcuts(); $res = '

'._b_('Abonnements').'

'.$cuts.$this->groups->to_html(true).$cuts; $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').'

'; } if ($first > count($this->spool->overview)) { $first = count($this->spool->overview); } $first = $first - ($first % $this->tmax) + 1; $cuts = displayshortcuts($first); $res = '

'.$group.'

'.$cuts; $res .= $this->spool->to_html($first, $first+$this->tmax); $this->nntp->quit(); return $res.$cuts; } function action_showArticle($group, $id, $part) { 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 displayshortcuts().'

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

'; } $cuts = displayshortcuts(); $res = '

'._b_('Message').'

'.$cuts; $res .= $this->post->to_html($part); $this->nntp->quit(); return $res.$cuts; } 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 displayshortcuts().'

'._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 displayshortcuts().'

'._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)) { $this->spool->delid($id); $this->nntp->quit(); header("Location: ?group=$group&first=$id"); } else { return '

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

'; } } function action_newFup($group, $id = -1) { $subject = $body = ''; $target = $group; if ($id > 0) { $this->nntp->group($group); if ($this->_newPost($id)) { $subject = preg_replace("/^re\s*:\s*/i", '', 'Re: '.$this->post->headers['subject']); $body = utf8_encode($this->post->name." "._b_("a écrit"))." :\n".wrap($this->post->get_body(), "> "); $target = isset($this->post->headers['followup-to']) ? $this->post->headers['followup-to'] : $this->post->headers['newsgroups']; } } $this->nntp->quit(); $cuts = displayshortcuts(); $html = '

'._b_('Nouveau message').'

'.$cuts; $html .= '
'; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; if ($this->can_attach) { $html .= ''; $html .= ''; } $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').'
'; $html .= '
'; if ($id > 0) { $html .= ''; } $html .= ''; $html .= '
'; return $html.$cuts; } function action_doFup($group, $artid = -1) { if ( ! ( is_utf8($_POST['subject']) && is_utf8($_POST['name']) && is_utf8($_POST['org']) && is_utf8($_POST['body']) ) ) { foreach(array('subject', 'name', 'org', 'body') as $key) { $_POST[$key] = utf8_encode($_POST[$key]); } } $to = preg_replace('/\s*(,|;)\s*/', ',', $_POST['newsgroups']); 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($_POST['followup']) ? '' : 'Followup-To: '.$_POST['followup']."\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)) { header("Location: ?group=$group".($artid==-1 ? '' : "&first=$artid")); } else { return "

"._b_('Impossible de poster le message')."

".$this->action_showThread($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; } } 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() { $this->_require('groups'); $this->groups = new BananaGroups(BANANA_GROUP_SUB); if ($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; } } ?>