'notify only the post author on new comments, uncheck to notify also administrators and editors', 'logfile'=>'log comment activity to file, useful for debugging comment spam together with the PostCommentDebug plugin'); var $default_context = 24; // LP_CONTEXT_POST | LP_CONTEXT_STATIC var $description = 'Manage posts comments'; var $active = true; var $hooks = array('parse_post'); var $logfile = ''; var $_logfile; var $_uniqid; var $mail_post_author_only = false; var $_post; var $_comment_id; var $_wp_htmltranswinuni = array( '€' => '€', // the Euro sign '' => '', '‚' => '‚', // these are Windows CP1252 specific characters 'ƒ' => 'ƒ', // they would look weird on non-Windows browsers '„' => '„', '…' => '…', '†' => '†', '‡' => '‡', 'ˆ' => 'ˆ', '‰' => '‰', 'Š' => 'Š', '‹' => '‹', 'Œ' => 'Œ', '' => '', 'Ž' => 'ž', '' => '', '' => '', '‘' => '‘', '’' => '’', '“' => '“', '”' => '”', '•' => '•', '–' => '–', '—' => '—', '˜' => '˜', '™' => '™', 'š' => 'š', '›' => '›', 'œ' => 'œ', '' => '', 'ž' => '', 'Ÿ' => 'Ÿ'); function PostComment(&$frontend, $args, $dummy_run=false) { $this->PostGenericAction($frontend, $args, $dummy_run); } function run($hook, &$post) { if (!empty($this->logfile)) { $f = @fopen($this->logfile, 'a'); if (is_resource($f)) { $this->_logfile =& $f; $this->_uniqid = strftime("%Y%m%d%H%M%S") . '_' . uniqid(); } } $this->_post =& $post; $this->_comment_id = null; $tpl =& $this->_frontend->tpl; $messages =& $this->_frontend->messages; $options =& $this->_frontend->options; $action =& $this->_action; // a trackback? $trackback = ($action == 'trackback') ? true : false; $now = time(); if ($trackback) { $this->debug("trackback received", __LINE__); if ($post['ping_status'] != 'open') $this->trackback_error("Trackbacks closed for this post"); $tb_fields = array('title', 'excerpt', 'url', 'blog_name', 'charset'); $this->_bootstrap($post, '', true, false, $tb_fields); // check trackback $user_data =& $this->_user_data; if (empty($user_data['ud_url'])) $this->trackback_error("No URL in request vars"); if (!preg_match('/^[a-zA-Z]+:\/\//', $user_data['ud_url'])) $this->trackback_error("Incorrect URL format."); // fix encoding in received field values $tb_charset = strtoupper(trim($user_data['ud_charset'])); if (!empty($tb_charset) && function_exists('mb_convert_encoding') && $tb_charset != $options['charset']) { foreach ($tb_fields as $tb_var) $user_data[$tb_var] = mb_convert_encoding($user_data[$tb_var], $options['charset'], $tb_charset); } $comment = array( 'post_id'=>$this->_post['post_id'], 'date'=>$now, 'author'=>'Anonymous Trackback', 'email'=>'', 'url'=>$user_data['ud_url'], 'comment'=>$user_data['ud_excerpt'], 'type'=>'trackback', 'approved'=>'0'); if (!empty($user_data['ud_blog_name'])) $comment['author'] = $user_data['ud_blog_name']; if (!empty($user_data['ud_title'])) { $comment['comment'] = "{$user_data['ud_title']}{$comment['comment']}"; } $comment['comment'] = $this->wp_formatting($comment['comment']); $comment['post_tstamp'] = $post['post_tstamp']; $comment['post_permalink'] = $post['post_permalink']; $this->debug("inserting trackback", __LINE__); // TODO: build the comment array structure here, and pass it as a reference to insertComment // TODO: check query result $this->_frontend->insertComment($comment, true); $this->debug("sending notification", __LINE__); $this->sendNotification($comment); $this->trackback_success(); } else { $this->debug("comment received", __LINE__); $comment_add_block = $tpl->setBlock('index', 'comment_add', 'BLOCK_COMMENT_ADD', false); if ($post['skip_form']) { // we can't display the form as something else is happening // (eg the "send post to a friend" form) $tpl->setVar('PLUGIN_POSTCOMMENT', ' '); if ($comment_add_block) $tpl->setVar('BLOCK_COMMENT_ADD', $messages['comments_closed']); return; } if ($post['comment_status'] != 'open') { $this->debug("comment status closed", __LINE__, true); // comments are closed, let's hide the plugin's template tag $tpl->setVar('PLUGIN_POSTCOMMENT', ' '); // and change the link above the comennts list if ($comment_add_block) $tpl->setVar('BLOCK_COMMENT_ADD', $messages['comments_closed']); return; } if ($comment_add_block) $tpl->parse('BLOCK_COMMENT_ADD', 'comment_add'); $this->_bootstrap($post, $messages['comment_form_message']); // too lazy to add $this->_ to every variable $message =& $this->_message; $message_class =& $this->_message_class; $user_data =& $this->_user_data; $labels =& $this->_labels; // handle comment submission if ($action == 'post_comment') { $this->debug("handling comment submission", __LINE__); // check comment fields $empty_fields = array(); foreach (array('name', 'email', 'text') as $key) { if (empty($user_data["ud_$key"])) $empty_fields[] = $key; } if (count($empty_fields) == 0) { $comment = array( 'post_id'=>$this->_post['post_id'], 'date'=>$now, 'author'=>$user_data['ud_name'], 'email'=>$user_data['ud_email'], 'url'=>$user_data['ud_url'], 'comment'=>$this->wp_formatting($user_data['ud_text']), 'type'=>'', 'approved'=>'0'); $comment['post_tstamp'] = $post['post_tstamp']; $comment['post_permalink'] = $post['post_permalink']; $this->_frontend->insertComment($comment); $this->sendNotification($comment); // check if we have to remove the user cookie if (!isset($_REQUEST['remember']) || $_REQUEST['remember'] != '1') $this->_frontend->removeUserCookie(); // redirect user so that he does not insert the comment twice $this->_frontend->redirectToPost($post['post_permalink'], $messages['comment_accepted']); } else { $this->debug("comment errors, redisplaying comment form", __LINE__, true); // we have errors, let's set warnings foreach ($empty_fields as $empty_field) $user_data["ud_label_$empty_field"] = "warning"; $message = $messages['comment_required_fields']; // . implode(", ", $empty_fields); $message_class = 'comment_form_warning'; } } // no action, let's set user data and display the form $this->debug("no action, redisplaying comment form", __LINE__, true); $tpl->setVar($user_data); $tpl->setVar(array( 'comment_form_message' => $message, 'comment_form_message_class' => $message_class)); $tpl->setFile('plugin_postcomment', 'plugins/post_comment.xml'); $tpl->parse('PLUGIN_POSTCOMMENT', 'plugin_postcomment'); } } function sendNotification(&$comment) { // TODO: check for approval status and mail sending options // TODO: use different templates based on approval status $this->debug("checking if we have to send a notification", __LINE__); $options =& $this->_frontend->options; // no comment inserted if (is_null($comment['id'])) return; // approval status switch ($comment['approved']) { case '1': // approved if (!$options['mail_on_comment']) return; break; case '0': case 'spam': if (!$options['comment_spam_mail']) return; } $this->debug("sending notification", __LINE__); $messages =& $this->_frontend->messages; $tpl =& $this->_frontend->tpl; $db =& $this->_frontend->db; $recipients = array(); $q = "select u.user_email from {$this->_frontend->tables['posts']} p inner join {$this->_frontend->tables['users']} u on p.post_author = u.id where p.id = {$this->_post['post_id']}"; if ($db->query($q)) $recipients[$db->get('user_email')] = ''; if (count($recipients) == 0 || !$this->mail_post_author_only) { $users =& $this->_frontend->getUserPerms(); foreach ($users as $user_id=>$user_data) { if ($user_data['user_level'] >= 3) $recipients[$user_data['user_email']] = ''; else if (isset($user_data['capabilities']['administrator']) || isset($user_data['capabilities']['editor'])) $recipients[$user_data['user_email']] = ''; } } $to = implode(', ', array_keys($recipients)); $this->debug("sending notification, recipients $to", __LINE__); $mh =& $this->_frontend->getMailHelper(); $this->debug("sending notification, got mail helper", __LINE__); $shortname = $mh->htent2qp($options['shortname']); $shortname_hdr = $mh->encoded2hdr($options['shortname']); $tpl->setVar(array( 'notify_shortname' => $shortname, 'notify_useremails' => $to, 'notify_post_title' => $mh->htent2qp($this->_post['post_title']), 'notify_post_name' => $mh->htent2qp($this->_post['post_name']), 'notify_post_permalink' => $mh->htent2qp($this->_post['post_permalink']), 'notify_comment_date' => $mh->htent2qp(strftime($options['date_format'], $comment['date'])), 'notify_comment_time' => $mh->htent2qp(strftime($options['time_format'], $comment['date'])), 'notify_comment_user' => $mh->htent2qp($comment['author']), 'notify_comment_email' => $mh->htent2qp($comment['email']), 'notify_comment_ip' => $_SERVER['REMOTE_ADDR'], 'notify_comment_agent' => $_SERVER['HTTP_USER_AGENT'], 'notify_comment_url' => $mh->htent2qp($comment['url']), 'notify_comment_id' => $comment['id'], 'notify_comment_type' => $comment['type'], 'notify_comment_approved' => $comment['approved'], 'notify_comment_text' => strip_tags($comment['comment']) )); $headers = array( 'Content-Type: text/plain; charset="' . $options['charset'] . '"', 'MIME-Version: 1.0', 'Content-Transfer-Encoding: quoted-printable', 'From: "'. $shortname_hdr . '" <' . $options['mail_from'] . '>'); $this->debug("sending notification, mail ready to send", __LINE__); if ($comment['approved'] == '1') $tpl->setFile('notify_email', 'plugins/post_comment_notification.txt'); else $tpl->setFile('notify_email', 'plugins/post_comment_notification_spam.txt'); $content = $tpl->parse('NOTIFY_EMAIL', 'notify_email', false, false); if (!$content) { $tpl->setFile('notify_email', 'plugins/post_comment_notification.txt'); $content = $tpl->parse('NOTIFY_EMAIL', 'notify_email'); } $title = "[$shortname_hdr] " . $this->_post['post_name'] . " " . $mh->encoded2hdr($messages['comment_mail_subject']) . ($comment['approved'] != '1' ? ' (spam)' : ''); $ret = $mh->send_mail($to, $title, $content, implode("\r\n", $headers)); $this->debug("sending notification, mail sent return $ret", __LINE__, true); return $ret; } function trackback_success() { $this->debug("trackback success", __LINE__, true); header('Content-Type: text/xml'); echo '_frontend->options['charset'] . '"?>' . "\n0\n"; exit; } function trackback_error($error="Error inserting trackback") { $this->debug("trackback error $error", __LINE__, true); header('Content-Type: text/xml'); echo '_frontend->options['charset'] . '"?>' . "\n1" . "" . htmlspecialchars($error, ENT_QUOTES) . "" . "\n"; exit; } function wp_formatting(&$text) { // stripped down version of WP's wp_formatting // will have to code this properly sooner or later... $output = ''; // Capture tags and everything inside them $textarr = preg_split("/(<[^>]+>)/s", $text, -1, PREG_SPLIT_DELIM_CAPTURE); $next = true; foreach ($textarr as $curl) { if (empty($curl)) continue; if ($curl[0] == '<') { if (strstr($curl, '_wp_htmltranswinuni); // Just a little XHTML help $output = str_replace('
', '
', $output); $output = str_replace('
', '
', $output); return $output; } function debug($message, $line, $close=false) { if (is_null($this->_logfile)) return; @fwrite($this->_logfile, "{$this->_uniqid} $line $message\r\n"); if ($close) { @fwrite($this->_logfile, "\r\n"); @fclose($this->_logfile); } } } ?>