X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fbanana.inc.php.in;h=386e4c1104aab32fe735134852677bbc9ecc5d58;hb=a3c90095a1920b1d39cb1e8ffd892ba407351ca6;hp=cef43004a96fb55ef8a44c7f888ce4befef142af;hpb=07f052121d5881636137834533d4e841ff597ce7;p=banana.git diff --git a/banana/banana.inc.php.in b/banana/banana.inc.php.in index cef4300..386e4c1 100644 --- a/banana/banana.inc.php.in +++ b/banana/banana.inc.php.in @@ -21,11 +21,12 @@ class Banana 'headers' => array('From' => 'Anonymous '), 'display' => 0, 'lastnews' => 0, - 'locale' => 'fr_FR', + 'locale' => 'fr_FR.UTF-8', 'subscribe' => array(), 'autoup' => 1); static public $boxpattern; static public $withtabs = true; + static public $baseurl = null; static public $mimeparts = array(); ### Spool ### @@ -49,10 +50,15 @@ class Banana static public $msgshow_mimeparts = array('multipart/report', 'multipart/mixed', 'text/html', 'text/plain', 'text/enriched', 'text', 'message'); static public $msgshow_xface = true; - static public $msgshow_wrap = 78; + static public $msgshow_wrap = 80; static public $msgshow_externalimages = false; static public $msgshow_hasextimages = false; static public $msgshow_withthread = true; + static public $msgshow_javascript = true; + + static public $msgshow_pgpcheck = true; + static public $msgshow_pgppath = 'gpg'; + static public $msgshow_pgpoptions = ''; /** Match an url * Should be included in a regexp delimited using /, !, , or @ (eg: "/$url_regexp/ui") @@ -65,7 +71,7 @@ class Banana * $matches[2] = "http://www.polytechnique.org" * $matches[3] = "]" */ - static public $msgshow_url = '(["\[])?((?:[a-z]+:\/\/|www\.)(?:[\.\,\;\!\:]*[a-z\@0-9~%$£µ&i#\-+=_\/\?]+)+)(["\]])?'; + static public $msgshow_url = '(["\[\<])?((?:[a-z]+:\/\/|www\.)(?:[\.\,\;\!\:]*[a-z\@0-9~%$£µ&i#\-+=_\/\?]+)+)(["\]\>])?'; ### Message edition ### static public $msgedit_canattach = true; @@ -77,15 +83,27 @@ class Banana */ static public $msgedit_mimeparts = array('multipart/report', 'multipart/mixed', 'text/plain', 'text/enriched', 'text/html', 'text', 'message'); +### Feed configuration ### + static public $feed_active = true; + static public $feed_format = 'rss2'; + static public $feed_updateOnDemand = false; // Update the feed each time sbd check it + static public $feed_copyright = null; // Global copyright informations + static public $feed_generator = 'Banana @VERSION@'; // Feed generator + static public $feed_email = null; // Admin e-mail + static public $feed_namePrefix = 'Banana :: '; + static public $feed_size = 15; // Number of messages in the feed + ### Protocole ### /** News serveur to use */ static public $nntp_host = 'news://localhost:119/'; static public $mbox_path = '/var/mail'; + static public $mbox_helper = './mbox-helper'; ### Debug ### static public $debug_nntp = false; + static public $debug_mbox = false; static public $debug_smarty = false; @@ -97,6 +115,7 @@ class Banana const ACTION_BOX_NEEDED = 1; // mask const ACTION_BOX_LIST = 2; const ACTION_BOX_SUBS = 4; + const ACTION_BOX_FEED = 8; const ACTION_MSG_LIST = 3; const ACTION_MSG_READ = 5; const ACTION_MSG_NEW = 9; @@ -162,7 +181,6 @@ class Banana Banana::load('page'); } Banana::$page = new $pageclass; - $types = array('multipart/report' => _b_('Rapport d\'erreur'), 'multipart/mixed' => _b_('Composition'), 'text/html' => _b_('Texte formaté'), @@ -179,21 +197,36 @@ class Banana */ protected function loadParams() { + foreach ($this->params as &$value) { + if ($value === "") { + $value = null; + } + } Banana::$group = isset($this->params['group']) ? $this->params['group'] : null; Banana::$artid = isset($this->params['artid']) ? $this->params['artid'] : null; Banana::$first = isset($this->params['first']) ? $this->params['first'] : null; Banana::$part = isset($this->params['part']) ? $this->params['part'] : 'text'; + $action = @$this->params['action']; + if ($action == 'rss' || $action == 'rss2' || $action == 'atom') { + if ($action == 'rss') { + $action = 'rss2'; + } + Banana::$feed_format = $action; + Banana::$action = Banana::ACTION_BOX_FEED; + return; + } + // Look for the action to execute if (is_null(Banana::$group)) { - if (isset($this->params['action']) && $this->params['action'] == 'subscribe') { + if ($action == 'subscribe') { Banana::$action = Banana::ACTION_BOX_SUBS; } else { Banana::$action = Banana::ACTION_BOX_LIST; } return; } - $action = isset($this->params['action']) ? $this->params['action'] : null; + if (is_null(Banana::$artid)) { if ($action == 'new') { Banana::$action = Banana::ACTION_MSG_NEW; @@ -234,7 +267,7 @@ class Banana return Banana::$page->kill(_b_('Connexion non-valide')); } if (Banana::$action & Banana::ACTION_BOX_NEEDED) { - if(Banana::$boxpattern && !preg_match('/' . Banana::$boxpattern . '/i', $group)) { + if(Banana::$boxpattern && !preg_match('/' . Banana::$boxpattern . '/i', Banana::$group)) { Banana::$page->setPage('group'); return Banana::$page->kill(_b_("Ce newsgroup n'existe pas ou vous n'avez pas l'autorisation d'y accéder")); } @@ -248,6 +281,9 @@ class Banana case Banana::ACTION_BOX_LIST: $error = $this->action_listBoxes(); break; + case Banana::ACTION_BOX_FEED: + $this->action_feed(); // generate its own xml + break; case Banana::ACTION_MSG_LIST: $error = $this->action_showThread(Banana::$group, Banana::$first); break; @@ -273,6 +309,27 @@ class Banana return Banana::$page->run(); } + /** Build and post a new message + * @return postid (or -1 if the message has not been found) + */ + public function post($dest, $reply, $subject, $body) + { + $hdrs = Banana::$protocole->requestedHeaders(); + $headers = Banana::$profile['headers']; + $headers[$hdrs['dest']] = $dest; + if ($reply) { + $headers[$hdrs['reply']] = $reply; + } + $headers['Subject'] = $subject; + $msg = BananaMessage::newMessage($headers, $body); + if (Banana::$protocole->send($msg)) { + Banana::$group = ($reply ? $reply : $dest); + $this->loadSpool(Banana::$group); + return Banana::$spool->getPostId($subject); + } + return -1; + } + /** Return the CSS code to include in the headers */ public function css() @@ -280,6 +337,26 @@ class Banana return Banana::$page->css; } + /** Return the Link to the feed of the page + */ + public function feed() + { + if (!Banana::$feed_active) { + return null; + } + return Banana::$page->makeURL(array('group' => Banana::$group, 'action' => Banana::$feed_format)); + } + + /** Return the execution backtrace of the current BananaProtocole + */ + public function backtrace() + { + if (Banana::$protocole) { + return Banana::$protocole->backtrace(); + } + return null; + } + /**************************************************************************/ /* actions */ /**************************************************************************/ @@ -305,12 +382,39 @@ class Banana { Banana::$page->setPage('forums'); $groups = Banana::$protocole->getBoxList(Banana::BOXES_SUB, Banana::$profile['lastnews'], true); - $newgroups = Banana::$protocole->getBoxList(Banana::BOXES_NEW, Banana::$profile['lastnews'], true); Banana::$page->assign('groups', $groups); - Banana::$page->assign('newgroups', $newgroups); + if (empty(Banana::$profile['subscribe']) || Banana::$profile['lastnews']) { + $newgroups = Banana::$protocole->getBoxList(Banana::BOXES_NEW, Banana::$profile['lastnews'], true); + Banana::$page->assign('newgroups', $newgroups); + } return true; } + protected function action_feed() + { + Banana::load('feed'); + if (Banana::$group) { + if (Banana::$feed_updateOnDemand) { + $this->loadSpool(Banana::$group); + } + $feed =& BananaFeed::getFeed(); + $feed->toXML(); + } + if (Banana::$profile['subscribe']) { + $subfeed = null; + foreach (Banana::$profile['subscribe'] as $group) { + Banana::$group = $group; + if (Banana::$feed_updateOnDemand) { + $this->loadSpool($group); + } + $feed =& BananaFeed::getFeed(); + $subfeed =& BananaFeed::merge($subfeed, $feed, _b_('Abonnements'), _b_('Mes abonnements Banana')); + } + $subfeed->toXML(); + } + Banana::$page->feed(); + } + protected function action_showThread($group, $first) { Banana::$page->setPage('thread'); @@ -397,16 +501,25 @@ class Banana $hdr_values = array(); foreach ($hdrs as $header) { $hdr_values[$header] = isset($headers[$header]['fixed']) ? $headers[$header]['fixed'] : @$_POST[$header]; + if (!is_utf8($hdr_values[$header])) { + $hdr_values[$header] = utf8_encode($hdr_values[$header]); + } + if ($headers != 'Subject') { + $hdr_values[$header] = str_replace(', ', ',', $hdr_values[$header]); + } } - if ($artid) { + if (!is_null($artid)) { $old =& $this->loadMessage($group, $artid); - $hdr_values['References'] = $old->getHeaderValue('references') . $old->getHeaderValue('message-id'); + $hdr_values['References'] = $old->getHeaderValue('references') . ' ' . $old->getHeaderValue('message-id'); } $msg = null; + if (isset($_POST['body']) && !is_utf8($_POST['body'])) { + $_POST['body'] = utf8_encode($_POST['body']); + } if (empty($hdr_values['Subject'])) { Banana::$page->trig(_b_('Le message doit avoir un sujet')); - } elseif (Banana::$msgedit_canattach && isset($_FILES['attachment'])) { - $uploaded = $_FILES['attachment']; + } elseif (Banana::$msgedit_canattach && isset($_FILES['attachment']) && $_FILES['attachment']['name']) { + $uploaded =& $_FILES['attachment']; if (!is_uploaded_file($uploaded['tmp_name'])) { Banana::$page->trig(_b_('Une erreur est survenue lors du téléchargement du fichier')); } else { @@ -417,10 +530,13 @@ class Banana } if (!is_null($msg)) { if (Banana::$protocole->send($msg)) { - Banana::$page->redirect(array('group' => $group, 'artid' => $artid)); - } - Banana::$page->trig(_b_('Une erreur est survenue lors de l\'envoi du message :') . '
' + $this->loadSpool($group); + $newid = Banana::$spool->updateUnread(Banana::$profile['lastnews']); + Banana::$page->redirect(array('group' => $group, 'artid' => $newid ? $newid : $artid)); + } else { + Banana::$page->trig(_b_('Une erreur est survenue lors de l\'envoi du message :') . '
' . Banana::$protocole->lastError()); + } } } else { if (!is_null($artid)) { @@ -489,7 +605,7 @@ class Banana return false; } return true; - } + } static public function createAllSpool(array $protos) { @@ -506,7 +622,7 @@ class Banana print "** $proto **\n"; foreach (array_keys($groups) as $g) { - print "Generating spool for $g : "; + print "Generating spool for $g: "; Banana::$group = $g; $spool = $banana->loadSpool($g); if (!$banana->checkErrors()) { @@ -514,11 +630,45 @@ class Banana } print "done.\n"; unset($spool); + Banana::$spool = null; } print "\n"; } } + static public function refreshAllFeeds(array $protos) + { + Banana::load('feed'); + Banana::$feed_updateOnDemand = true; // In order to force update + foreach ($protos as $proto) { + $banana = new Banana(array(), $proto); + + if (!$banana->checkErrors()) { + continue; + } + $groups = Banana::$protocole->getBoxList(); + if (!$banana->checkErrors()) { + continue; + } + + print "** $proto **\n"; + foreach (array_keys($groups) as $g) { + print "Generating feed cache for $g: "; + Banana::$group = $g; + $spool = $banana->loadSpool($g); + if (!$banana->checkErrors()) { + break; + } + $feed =& BananaFeed::getFeed(); + print "done.\n"; + unset($feed); + unset($spool); + Banana::$spool = null; + } + print "\n"; + } + } + /**************************************************************************/ /* Private functions */ /**************************************************************************/ @@ -528,19 +678,23 @@ class Banana Banana::load('spool'); if (!Banana::$spool || Banana::$spool->group != $group) { $clean = false; - if ($group == @$_SESSION['banana_group'] && isset($_SESSION['banana_spool'])) { - Banana::$spool = unserialize($_SESSION['banana_spool']); - $clean = @(Banana::$profile['lastnews'] != $_SESSION['banana_lastnews']); - } else { - unset($_SESSION['banana_message']); - unset($_SESSION['banana_artid']); - unset($_SESSION['banana_showhdr']); + if (php_sapi_name() != 'cli') { + if ($group == @$_SESSION['banana_group'] && isset($_SESSION['banana_spool'])) { + Banana::$spool = unserialize($_SESSION['banana_spool']); + $clean = @(Banana::$profile['lastnews'] != $_SESSION['banana_lastnews']); + } else { + unset($_SESSION['banana_message']); + unset($_SESSION['banana_artid']); + unset($_SESSION['banana_showhdr']); + } } BananaSpool::getSpool($group, Banana::$profile['lastnews'], Banana::$profile['autoup'] || $clean); - $_SESSION['banana_group'] = $group; - if (!Banana::$profile['display']) { - $_SESSION['banana_spool'] = serialize(Banana::$spool); - $_SESSION['banana_lastnews'] = Banana::$profile['lastnews']; + if (php_sapi_name() != 'cli') { + $_SESSION['banana_group'] = $group; + if (!Banana::$profile['display']) { + $_SESSION['banana_spool'] = serialize(Banana::$spool); + $_SESSION['banana_lastnews'] = Banana::$profile['lastnews']; + } } Banana::$spool->setMode(Banana::$profile['display'] ? Banana::SPOOL_UNREAD : Banana::SPOOL_ALL); } @@ -578,6 +732,7 @@ class Banana unset($_SESSION['banana_artid']); } } + $this->loadSpool($group); return true; }